亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標題:
51單片機學習,操作1602液晶
[打印本頁]
作者:
51黑電子迷
時間:
2017-2-9 22:16
標題:
51單片機學習,操作1602液晶
TX-1C板
操作并行模式的1602液晶
液晶第1,2腳是gnd和vcc
第3腳是對比度調節
第4腳是數據/指令選擇端RS
第5腳是讀寫選擇端R/W,我們這次只寫不讀,故直接接地
第6腳是讀寫使能EN
第7到14腳是數據口,我們接STC89C52RC的P0口
第15,16腳是背光源
最終液晶顯示
Tom is playing the TNT game!
#include <reg52.h>
#include "MY51.H"
void write_data(uchar dataValue); //寫數據
void write_cmd(uchar cmdValue); //寫指令
uchar code tableLCD1[] ={"Tom is playing"};
uchar code tableLCD2[] ={" the TNT game!"};
void lcdInit() //初始化函數
{
dula=0; //
wela=0; //防止數碼管誤顯,浪費電流
lcdEN=low; //給高脈沖之前的狀態
lcdRS=high; //初始給高電平,其實上電默認也是高電平
write_cmd(0x38); //液晶顯示模式初始化
write_cmd(0x0c); //打開液晶,不顯示光標,光標不閃爍
write_cmd(0x06); //地址指針加加,且光標加加
write_cmd(0x01); //液晶數據指針和顯示清零
}
void write_cmd(uchar cmdValue) //寫入指令
{
lcdRS=low; //剛上電時是高電平,低電平時是指令模式
P0=cmdValue;
delayms(1);
lcdEN=high; //一個高脈沖把數據讀走
delayms(1);
lcdEN=low;
}
void write_data(uchar dataValue) //寫入數據
{
lcdRS=high; //高電平是數據模式
P0=dataValue;
delayms(1);
lcdEN=high; //給一個高脈沖
delayms(1);
lcdEN=low;
}
void lcdShow(uchar* pValue) //液晶顯示函數
{
while(*pValue!='\0')
{
write_data(*pValue);
pValue++;
}
}
void main()
{
lcdInit(); //初始化
lcdShow(tableLCD1); //顯示第一行
write_cmd(0x80+0x40); //重新設置數據顯示指針
lcdShow(tableLCD2); //顯示第二行
while(1);
}
復制代碼
#ifndef _MY51_H_
#define _MY51_H_
#include <math.h>
#include <intrins.h>
typedef int int16 ;
typedef int INT16 ;
typedef unsigned int uint16 ;
typedef unsigned int UINT16 ;
typedef unsigned short uint ;
typedef unsigned short UINT ;
typedef unsigned short word ;
typedef unsigned short WORD ;
typedef unsigned long uint32 ;
typedef unsigned long UINT32 ;
typedef unsigned long DWORD ;
typedef unsigned long dword ;
typedef signed long int32 ;
typedef signed long INT32 ;
typedef float float32 ;
typedef double double64 ;
typedef signed char int8 ;
typedef signed char INT8 ;
typedef unsigned char byte ;
typedef unsigned char BYTE ; //WINDOWS的windef.h里面是這么定義的
typedef unsigned char uchar ;
typedef unsigned char UCHAR ;
typedef unsigned char UINT8 ;
typedef unsigned char uint8 ;
typedef unsigned char BOOL ; //windows中定義BOOL為int
typedef unsigned char bool ; //bool是c++的內置類型
#define TRUE 1
#define true 1
#define FALSE 0
#define false 0
#define open 1 //open和close用于 標志打開和關閉狀態
#define OPEN 1
#define close 0
#define CLOSE 0
#define lock 0
#define start 1
#define START 1
#define stop 0
#define STOP 0
#define keyDown 0
#define keyUp 1
#define gnd 0 //接地
#define GND 0 //接地
#define high 1 //高電平
#define low 0 //低電平
#define yes 1
#define YES 1
#define no 0
#define NO 0
sbit dula =P2^6; //段選鎖存器控制 控制筆段
sbit wela =P2^7; //位選鎖存器控制 控制位置
#define led P1 //燈總線控制
sbit led0=P1^0; //8個led燈,陰極送低電平點亮
sbit led1=P1^1;
sbit led2=P1^2;
sbit led3=P1^3;
sbit led4=P1^4;
sbit led5=P1^5;
sbit led6=P1^6;
sbit led7=P1^7;
sbit keyS2=P3^4; //4個獨立按鍵
sbit keyS3=P3^5;
sbit keyS4=P3^6;
sbit keyS5=P3^7;
sbit lcdEN=P3^4; //液晶通訊使能端en,高脈沖有效
sbit lcdRS=P3^5; //液晶第4腳,RS,低電平是指令模式,高電平是數據模式
//sbit lcdR/W //液晶第5腳,低電平是寫入模式,因為我們只寫不讀,所以接地
sbit csda=P3^2; //DAC0832模數轉換cs口
sbit adwr=P3^6; //ADC0804這個同DAC0832
sbit dawr=P3^6;
sbit adrd=P3^7; //ADC0804
sbit beep=P2^3; //蜂鳴器
void displaySMG(uint8 one,uint8 two,uint8 three,uint8 four,uint8 five,uint8 six,uint8 dot);
void delayms(uint16 ms);
void T0_Work();
void delayms(uint16 ms) //軟延時函數
{
uint16 i,j;
for(i=ms;i>0;i--)
{
for(j=113;j>0;j--)
{}
}
}
///////////////////////////////////////////////////////////////////////////
#define dark 0x11 //在段中,0x11是第17號元素,為0是低電平,數碼管不亮
#define dotDark 0xff //小數點全暗時
uint8 code table[]= { //0~F外加小數點和空輸出的數碼管編碼
0x3f , 0x06 , 0x5b , 0x4f , // 0 1 2 3
0x66 , 0x6d , 0x7d , 0x07 , // 4 5 6 7
0x7f , 0x6f , 0x77 , 0x7c , // 8 9 A B
0x39 , 0x5e , 0x79 , 0x71 , // C D E F
0x80 , 0x00 ,0x40 // . 空 負號 空時是第0x11號也就是第17號元素
};
uint8 dotTable[]={ //小數點位置
0xff , //全暗
0xfe , 0xfd , 0xfb , //1 2 3
0xf7 , 0xef , 0xdf //4 5 6
};
/////////////////////////////////////////////////////////////////////////////
uint8 TH0Cout=0 ; //初值
uint8 TL0Cout=0 ;
uint16 T0IntCout=0; //中斷計數
uint16 T0IntCountAll=0; //(N-1)/65536+1; //總中斷次數
bool bT0Delay=false; //使用延時函數標志,初始未用
bool bT0Over=false; //中斷處理函數執行結果之一
void startT0(uint32 ms) //開啟定時器
{
float32 t=ms/1000.0; //定時時間
double64 fox =11.0592*(pow(10,6)); //晶振頻率
uint32 N=(t*fox)/12 ; //定時器總計數值
TH0Cout =(65536-N%65536)/256; //裝入計時值零頭計數初值
TL0Cout =(65536-N%65536)%256;
T0IntCountAll=(N-1)/65536+1; //總中斷次數
TMOD=TMOD | 0x01; //設置定時器0的工作方式為1
EA =open; //打開總中斷
ET0=open; //打開定時器中斷
TH0=TH0Cout; //定時器裝入初值
TL0=TL0Cout;
TR0=start; //啟動定時器
}
void delayT0(uint32 ms) //硬延時函數,自己亂寫的不好用,求指點
{
startT0(ms); //啟動定時器
bT0Delay=true; //告訴T0定時器,起用延時模式
while(bT0Over==false); //時間沒到的話繼續檢測
bT0Over=false; //時間到了,讓標志復位
}
void T0_times() interrupt 1 //T0定時器中斷函數
{
T0IntCout++;
if(T0IntCout==T0IntCountAll) //達到總中斷次數值
{
T0IntCout=0; //中斷次數清零,重新計時
bT0Over=true; //時間真的到了
if(bT0Delay) //本次中斷是用來延時的嗎
{
TR0=stop; //如果是由延時函數開啟T0的話,關閉T0
return;
}
TH0=TH0Cout; //循環定時的話要重裝初值,每次定時1秒,重裝一次
TL0=TL0Cout;
T0_Work(); //工作函數
}
}
////////////////////////////////////////////////////////////////////////////////
void displaySMG(uint8 oneWela,uint8 twoWela,uint8 threeWela,uint8 fourWela,uint8 fiveWela,uint8 sixWela,uint8 dot)
{
//控制6位數碼管顯示函數,不顯示的位用參數dark,保留ADC0804的片選信號
uint8 csadState=0x80&P0; //提取最高位,即ADC0804的片選信號
uint8 tempP0=((csadState==0)?0x7f:0xff); //數碼管位選初始信號,陰極全置高電平
P0=tempP0; //0x7f表示數碼管不亮,同時ADC0804片選有效
wela=1; //注:wela和dula上電默認為1
P0=tempP0;
wela=0;
P0=0; //由于數碼管是共陰極的,陽極送低電平,燈不亮,防止燈誤亮
dula=1;
P0=0;
dula=0; //段選數據清空并鎖定
//////////////////////////oneWela
{ //消除疊影,數碼管陰極置高電平,并鎖存
P0=tempP0;
wela=1;
P0=tempP0;
wela=0;
}
P0=0; //低電平送到數碼管陽極,避免數碼管誤亮
dula=1;
P0=table[oneWela]|((0x01&dot)?0x00:0x80); //送段數據,疊加小數點的顯示
dula=0;
P0=tempP0; //送位數據前關閉所有顯示,并保持csad信號
wela=1;
P0=tempP0 & 0xfe; //0111 1110最高位是AD片選,低6位是數碼管位選,低電平有效
wela=0;
delayms(2);
/////////////////////////twoWela
{ //消除疊影
P0=tempP0;
wela=1;
P0=tempP0;
wela=0;
}
P0=0;
dula=1;
P0=table[twoWela]|((0x02&dot)?0x00:0x80);
dula=0;
P0=tempP0;
wela=1;
P0=tempP0 & 0xfd; //0111 1101
wela=0;
delayms(2);
/////////////////////////threeWela
{ //消除疊影
P0=tempP0;
wela=1;
P0=tempP0;
wela=0;
}
P0=0;
dula=1;
P0=table[threeWela]|((0x04&dot)?0x00:0x80);
dula=0;
P0=tempP0;
wela=1;
P0=tempP0 & 0xfb; //0111 1011
wela=0;
delayms(2);
/////////////////////////fourWela
{ //消除疊影
P0=tempP0;
wela=1;
P0=tempP0;
wela=0;
}
P0=0;
dula=1;
P0=table[fourWela]|((0x08&dot)?0x00:0x80);
dula=0;
P0=tempP0;
wela=1;
P0=tempP0 & 0xf7; //0111 0111
wela=0;
delayms(2);
/////////////////////////fiveWela
{ //消除疊影
P0=tempP0;
wela=1;
P0=tempP0;
wela=0;
}
P0=0;
dula=1;
P0=table[fiveWela]|((0x10&dot)?0x00:0x80);
dula=0;
P0=tempP0;
wela=1;
P0=tempP0 & 0xef; //0110 1111
wela=0;
delayms(2);
/////////////////////////sixWela
{ //消除疊影
P0=tempP0;
wela=1;
P0=tempP0;
wela=0;
}
P0=0;
dula=1;
P0=table[sixWela]|((0x20&dot)?0x00:0x80);
dula=0;
P0=tempP0;
wela=1;
P0=tempP0 & 0xdf; //0101 1111
wela=0;
delayms(2);
}
#endif
復制代碼
作者:
hahahahe
時間:
2017-2-10 12:23
非常感謝
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1