|
- //用三個(gè)74hc595控制三個(gè)lcd1602,
- #include <reg51.h>
- #include <stdio.h>
- //引腳定義
- sbit LCD1602_SHCP=P3^4;
- sbit LCD1602_DS=P3^5;
- sbit LCD1602_STCP=P3^6;
- sbit LCD1602_STCP2=P3^7;
- sbit LCD1602_STCP3=P3^3;
- //兩種數(shù)據(jù)類型
- typedef unsigned char uchar;
- typedef unsigned int uint;
- //定義數(shù)據(jù)槽
- uchar RS,RW,E,D4,D5,D6,D7;
- //二進(jìn)制的形象表示方法,從左到右分別位第7 6 5 4 3 2 1 0位
- #define bin(_a,_b,_c,_d,_e,_f,_g,_h) ((_a)<<7|(_b)<<6|(_c)<<5|(_d)<<4|(_e)<<3|(_f)<<2|(_g)<<1|(_h)) //二進(jìn)制的表示
- void Lcd1602_Delay1ms(uint c); //延時(shí)函數(shù),延時(shí)1ms
- void LCD1602_DATAPINS(uchar value, uchar num); //更改74HC595連接LCD1602的數(shù)據(jù)
- void LcdCalc(uchar i); //確定4位總線
- void LcdWriteCom(uchar com, uchar num); //向LCD寫入一個(gè)字節(jié)的命令
- void LcdWriteData(uchar dat, uchar num); //向LCD寫入一個(gè)字節(jié)的數(shù)據(jù)
- void LcdInit(); //初始化LCD屏
- void LcdPrintf(uchar *s, uchar num); //向屏幕輸出字符
- void LcdWriteCGRAM(uchar index,uchar *p, uchar num); //建立一個(gè)自定義字符
- void LCDPrintNum(uint number,uchar wei, uchar num); //顯示數(shù)字
- /*******************************************************************************
- * 函 數(shù) 名 : Lcd1602_Delay1ms
- * 函數(shù)功能 : 延時(shí)函數(shù),延時(shí)1ms
- * 輸 入 : c
- * 輸 出 : 無(wú)
- * 說(shuō) 名 : 該函數(shù)是在12MHZ晶振下,12分頻單片機(jī)的延時(shí)。
- *******************************************************************************/
- void Lcd1602_Delay1ms(uint c) //誤差 0us
- {
- uchar a,b;
- for(;c>0;c--){
- for(b=199;b>0;b--){
- for(a=1;a>0;a--);
- }
- }
- }
- /*******************************************************************************
- * 函 數(shù) 名 : LCD1602_DATAPINS
- * 函數(shù)功能 : 更改74HC595連接LCD1602的數(shù)據(jù)
- * 輸 入 : value
- * 輸 出 : 無(wú)
- *******************************************************************************/
- void LCD1602_DATAPINS(uchar value, uchar num)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- LCD1602_DS=value&0x80;//取數(shù)據(jù)高位
- if(LCD1602_DS==0x80){ //判斷數(shù)據(jù)高位是否為1
- LCD1602_DS=1;//如果高位為1,DS置1
- }
- else{
- LCD1602_DS=0;//否則DS置0
- }
- LCD1602_SHCP=0;
- LCD1602_SHCP=1;//上升沿使這一位寫入移位寄存器
- value<<=1;//數(shù)據(jù)左移1位,數(shù)據(jù)的第7位變?yōu)樽罡呶,循環(huán)第8次時(shí)數(shù)據(jù)的最低位也變成最高位
- }
- if (num==2)
- {
- LCD1602_STCP3=0;
- LCD1602_STCP3=1;//給STCP一個(gè)上升沿,將for循環(huán)中輸入的數(shù)據(jù)移入輸出鎖存寄存器,刷新輸出數(shù)據(jù)
- }
- else if(num==1)
- {
- LCD1602_STCP2=0;
- LCD1602_STCP2=1;//給STCP一個(gè)上升沿,將for循環(huán)中輸入的數(shù)據(jù)移入輸出鎖存寄存器,刷新輸出數(shù)據(jù)
- }
- else
- {
- LCD1602_STCP=0;
- LCD1602_STCP=1;//給STCP一個(gè)上升沿,將for循環(huán)中輸入的數(shù)據(jù)移入輸出鎖存寄存器,刷新輸出數(shù)據(jù)
- }
- }
- /*******************************************************************************
- * 函 數(shù) 名 : LcdCalc
- * 函數(shù)功能 : 確定4位總線
- * 輸 入 : i
- * 輸 出 : 無(wú)
- *******************************************************************************/
- void LcdCalc(uchar i)
- {
- if(i==0x00){
- D4=0;
- D5=0;
- D6=0;
- D7=0;
- }
- if(i==0x01){
- D4=1;
- D5=0;
- D6=0;
- D7=0;
- }
- if(i==0x02){
- D4=0;
- D5=1;
- D6=0;
- D7=0;
- }
- if(i==0x03){
- D4=1;
- D5=1;
- D6=0;
- D7=0;
- }
- if(i==0x04){
- D4=0;
- D5=0;
- D6=1;
- D7=0;
- }
- if(i==0x05){
- D4=1;
- D5=0;
- D6=1;
- D7=0;
- }
- if(i==0x06){
- D4=0;
- D5=1;
- D6=1;
- D7=0;
- }
- if(i==0x07){
- D4=1;
- D5=1;
- D6=1;
- D7=0;
- }
- if(i==0x08){
- D4=0;
- D5=0;
- D6=0;
- D7=1;
- }
- if(i==0x09){
- D4=1;
- D5=0;
- D6=0;
- D7=1;
- }
- if(i==0x0a){
- D4=0;
- D5=1;
- D6=0;
- D7=1;
- }
- if(i==0x0b){
- D4=1;
- D5=1;
- D6=0;
- D7=1;
- }
- if(i==0x0c){
- D4=0;
- D5=0;
- D6=1;
- D7=1;
- }
- if(i==0x0d){
- D4=1;
- D5=0;
- D6=1;
- D7=1;
- }
- if(i==0x0e){
- D4=0;
- D5=1;
- D6=1;
- D7=1;
- }
- if(i==0x0f){
- D4=1;
- D5=1;
- D6=1;
- D7=1;
- }
- if(i==0x10){
- D4=1;
- D5=0;
- D6=0;
- D7=0;
- }
- if(i==0x20){
- D4=0;
- D5=1;
- D6=0;
- D7=0;
- }
- if(i==0x30){
- D4=1;
- D5=1;
- D6=0;
- D7=0;
- }
- if(i==0x40){
- D4=0;
- D5=0;
- D6=1;
- D7=0;
- }
- if(i==0x50){
- D4=1;
- D5=0;
- D6=1;
- D7=0;
- }
- if(i==0x60){
- D4=0;
- D5=1;
- D6=1;
- D7=0;
- }
- if(i==0x70){
- D4=1;
- D5=1;
- D6=1;
- D7=0;
- }
- if(i==0x80){
- D4=0;
- D5=0;
- D6=0;
- D7=1;
- }
- if(i==0x90){
- D4=1;
- D5=0;
- D6=0;
- D7=1;
- }
- if(i==0xa0){
- D4=0;
- D5=1;
- D6=0;
- D7=1;
- }
- if(i==0xb0){
- D4=1;
- D5=1;
- D6=0;
- D7=1;
- }
- if(i==0xc0){
- D4=0;
- D5=0;
- D6=1;
- D7=1;
- }
- if(i==0xd0){
- D4=1;
- D5=0;
- D6=1;
- D7=1;
- }
- if(i==0xe0){
- D4=0;
- D5=1;
- D6=1;
- D7=1;
- }
- if(i==0xf0){
- D4=1;
- D5=1;
- D6=1;
- D7=1;
- }
- }
- /*******************************************************************************
- * 函 數(shù) 名 : LcdWriteCom
- * 函數(shù)功能 : 向LCD寫入一個(gè)字節(jié)的命令
- * 輸 入 : com
- * 輸 出 : 無(wú)
- *******************************************************************************/
- void LcdWriteCom(uchar com, uchar num) //寫入命令
- {
- E = 0; //使能清零
- RS = 0; //選擇寫入命令
- RW = 0; //選擇寫入
- LcdCalc(com>>4); //發(fā)送高四位
- Lcd1602_Delay1ms(1);
- E = 1; //寫入時(shí)序
- LCD1602_DATAPINS(bin(0,D7,D6,D5,D4,E,RW,RS),num);
- Lcd1602_Delay1ms(5);
- E = 0;
- LCD1602_DATAPINS(bin(0,D7,D6,D5,D4,E,RW,RS),num);
- LcdCalc(com<<4); //發(fā)送低四位
- Lcd1602_Delay1ms(1);
- E = 1; //寫入時(shí)序
- LCD1602_DATAPINS(bin(0,D7,D6,D5,D4,E,RW,RS),num);
- Lcd1602_Delay1ms(5);
- E = 0;
- LCD1602_DATAPINS(bin(0,D7,D6,D5,D4,E,RW,RS),num);
- }
- /****************************************************************************
- * 函 數(shù) 名 : LcdWriteData
- * 函數(shù)功能 : 向LCD寫入一個(gè)字節(jié)的數(shù)據(jù)
- * 輸 入 : dat
- * 輸 出 : 無(wú)
- *******************************************************************************/
- void LcdWriteData(uchar dat, uchar num) //寫入數(shù)據(jù)
- {
- E = 0; //使能清零
- RS = 1; //選擇寫入數(shù)據(jù)
- RW = 0; //選擇寫入
- LcdCalc(dat>>4); //發(fā)送高四位
- Lcd1602_Delay1ms(1);
- E = 1; //寫入時(shí)序
- LCD1602_DATAPINS(bin(0,D7,D6,D5,D4,E,RW,RS),num);
- Lcd1602_Delay1ms(5);
- E = 0;
- LCD1602_DATAPINS(bin(0,D7,D6,D5,D4,E,RW,RS),num);
- LcdCalc(dat<<4); //發(fā)送低四位
- Lcd1602_Delay1ms(1);
- E = 1; //寫入時(shí)序
- LCD1602_DATAPINS(bin(0,D7,D6,D5,D4,E,RW,RS),num);
- Lcd1602_Delay1ms(5);
- E = 0;
- LCD1602_DATAPINS(bin(0,D7,D6,D5,D4,E,RW,RS),num);
- }
- /*******************************************************************************
- * 函 數(shù) 名 : LcdInit
- * 函數(shù)功能 : 初始化LCD屏
- * 輸 入 : 無(wú)
- * 輸 出 : 無(wú)
- *******************************************************************************/
- void LcdInit() //LCD初始化子程序
- {
- LcdWriteCom(0x32,0); //將8位總線轉(zhuǎn)為4位總線
- LcdWriteCom(0x28,0); //在四位線下的初始化
- LcdWriteCom(0x0c,0); //開顯示不顯示光標(biāo)
- LcdWriteCom(0x06,0); //寫一個(gè)指針加1
- LcdWriteCom(0x01,0); //清屏
- LcdWriteCom(0x80,0); //設(shè)置數(shù)據(jù)指針起點(diǎn)
- LcdWriteCom(0x32,1); //將8位總線轉(zhuǎn)為4位總線
- LcdWriteCom(0x28,1); //在四位線下的初始化
- LcdWriteCom(0x0c,1); //開顯示不顯示光標(biāo)
- LcdWriteCom(0x06,1); //寫一個(gè)指針加1
- LcdWriteCom(0x01,1); //清屏
- LcdWriteCom(0x80,1); //設(shè)置數(shù)據(jù)指針起點(diǎn)
- LcdWriteCom(0x32,2); //將8位總線轉(zhuǎn)為4位總線
- LcdWriteCom(0x28,2); //在四位線下的初始化
- LcdWriteCom(0x0c,2); //開顯示不顯示光標(biāo)
- LcdWriteCom(0x06,2); //寫一個(gè)指針加1
- LcdWriteCom(0x01,2); //清屏
- LcdWriteCom(0x80,2); //設(shè)置數(shù)據(jù)指針起點(diǎn)
- }
- /*******************************************************************************
- * 函 數(shù) 名 : LcdPrintf
- * 函數(shù)功能 : 向屏幕輸出字符
- * 輸 入 : *s
- * 輸 出 : 無(wú)
- *******************************************************************************/
- void LcdPrintf(uchar *s, uchar num)
- {
- while(*s>0)LcdWriteData(*s++, num);
- }
- /*******************************************************************************
- * 函 數(shù) 名 : LcdWriteCGRAM
- * 函數(shù)功能 : 建立一個(gè)自定義字符
- * 輸 入 : index、*p
- * 輸 出 : 無(wú)
- *******************************************************************************/
- void LcdWriteCGRAM(uchar index,uchar *p, uchar num)
- {
- uchar i;
- index <<=3; //index *= 8
- for(i=0;i<8;++i){
- LcdWriteCom(0x40 | index+i, num);//寫CGRAM地址
- LcdWriteData(*p++, num);
- }
- LcdWriteCom(0x80, num);
- }
- /*******************************************************************************
- * 函 數(shù) 名 : LcdPrintNum
- * 函數(shù)功能 : 顯示數(shù)字
- * 輸 入 : num、wei
- * 輸 出 : 無(wú)
- *******************************************************************************/
- void LCDPrintNum(uint number,uchar wei, uchar num)//wei 數(shù)字占的位數(shù)
- {
- uchar tempstring[6];
- uchar n[5];
- uchar i,j=0;
- n[0]=number/10000;
- n[1]=number%10000/1000;
- n[2]=number%1000/100;
- n[3]=number%100/10;
- n[4]=number%10;
- i=5-wei;
- for(i;i<5;i++){
- tempstring[j++]=n[i]+'0';
- }
- tempstring[j]='\0';
- LcdPrintf(tempstring, num);
- }
- const uchar type_t[]={
- 0x1f,0x02,0x02,0x02,
- 0x02,0x02,0x02,0x00
- }; //顯示一種用于以前的logo的“T”字符
- const uchar line1[]="Have a nice day!";
- const uchar line2[]="HE Wcommands";
- void main()
- {
- uchar i;
- LcdInit();
- LcdWriteCGRAM(0x00,type_t,0);
- LcdWriteData(0x00,0);
- LcdWriteCom(0x81,0);
- LcdPrintf("HE With",0);
- LcdWriteCom(0xc0,0);
- LcdPrintf("Commands",0);
- Lcd1602_Delay1ms(1000);
- LcdWriteCGRAM(0x00,type_t,1);
- LcdWriteData(0x00,1);
- LcdWriteCom(0x81,1);
- LcdPrintf("HE With",1);
- LcdWriteCom(0xc0,1);
- LcdPrintf("2nd Display",1);
- Lcd1602_Delay1ms(500);
- LcdWriteCGRAM(0x00,type_t,2);
- LcdWriteData(0x00,2);
- LcdWriteCom(0x81,2);
- LcdPrintf("HE With",2);
- LcdWriteCom(0xc0,2);
- LcdPrintf("3rd Display",2);
- Lcd1602_Delay1ms(500);
- LcdWriteCom(0x01,0);
- while(1){
- for(i=0;i<16;i++){
- LcdWriteCom(0x80+i,0);
- LcdWriteData(line1[i],0);
- Lcd1602_Delay1ms(100);
- }
- Lcd1602_Delay1ms(500);
- LcdWriteCom(0xc1,0);
- LcdWriteData(0x00,0);
- Lcd1602_Delay1ms(100);
- for(i=0;i<12;i++){
- LcdWriteCom(0xc2+i,0);
- LcdWriteData(line2[i],0);
- Lcd1602_Delay1ms(100);
- }
- LcdWriteCom(0x01,0);
- Lcd1602_Delay1ms(100);
- }
- }
復(fù)制代碼 |
|