完全使用3個IO口驅動LCD1602
8051三線傳送數據到74HC595,驅動LCD1602.利用位變量可位操作,程序更加簡單。根據網上別人的程序改編而來。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif (180.13 KB, 下載次數: 49)
下載附件
2022-11-27 16:59 上傳
/*hc595->1602管腳連接bin(D7,D6,D5,D4,0,E,RW,RS)*/
#include <reg52.h>
//8051->hc595引腳定義
sbit LCD1602_SHCP=P3^6; //in clock
sbit LCD1602_DS=P3^4; //in data
sbit LCD1602_STCP=P3^5; //out clock
//兩種數據類型
typedef unsigned char uchar;
typedef unsigned int uint;
//定義數據槽
//uchar RS,RW,E,D4,D5,D6,D7;
bdata uchar sendData;
sbit RS = sendData^0;
sbit RW = sendData^1;
sbit E = sendData^2;
單片機源程序如下:
- #include <reg52.h>
- #include "lcd595.h"
- const uchar type_t[]={
- 0x1f,0x02,0x02,0x02,
- 0x02,0x02,0x02,0x00
- };
- const uchar line1[]="Have a nice day!";
- const uchar line2[]="HE Wcommands";
- void main()
- {
- uchar i;
- LcdInit();
- LcdWriteCGRAM(0x00,type_t);
- LcdWriteData(0x00);
- LcdWriteCom(0x81);
- LcdPrintf("HE With");
- LcdWriteCom(0xc0);
- LcdPrintf("Commands");
- Lcd1602_Delay1ms(1000);
- LcdWriteCom(0x01);
- while(1){
- for(i=0;i<16;i++){
- LcdWriteCom(0x80+i);
- LcdWriteData(line1[i]);
- Lcd1602_Delay1ms(100);
- }
- Lcd1602_Delay1ms(500);
- LcdWriteCom(0xc1);
- LcdWriteData(0x00);
- Lcd1602_Delay1ms(100);
- for(i=0;i<12;i++){
- LcdWriteCom(0xc2+i);
- LcdWriteData(line2[i]);
- Lcd1602_Delay1ms(100);
- }
- LcdWriteCom(0x01);
- Lcd1602_Delay1ms(100);
- }
- }
復制代碼- /*hc595->1602管腳連接bin(D7,D6,D5,D4,0,E,RW,RS)*/
- #include <reg52.h>
- //8051->hc595引腳定義
- sbit LCD1602_SHCP=P3^6; //in clock
- sbit LCD1602_DS=P3^4; //in data
- sbit LCD1602_STCP=P3^5; //out clock
- //兩種數據類型
- typedef unsigned char uchar;
- typedef unsigned int uint;
- //定義數據槽
- //uchar RS,RW,E,D4,D5,D6,D7;
- bdata uchar sendData;
- sbit RS = sendData^0;
- sbit RW = sendData^1;
- sbit E = sendData^2;
- sbit D4 = sendData^3;
- sbit D5 = sendData^4;
- sbit D6 = sendData^5;
- sbit D7 = sendData^6;
- void Lcd1602_Delay1ms(uint c); //延時函數,延時1ms
- void LCD1602_DATAPINS(uchar value); //更改74HC595連接LCD1602的數據
- void LcdCalc(uchar i); //確定4位總線
- void LcdWriteCom(uchar com); //向LCD寫入一個字節的命令
- void LcdWriteData(uchar dat); //向LCD寫入一個字節的數據
- void LcdInit(); //初始化LCD屏
- void LcdPrintf(uchar *s); //向屏幕輸出字符
- void LcdWriteCGRAM(uchar index,uchar *p); //建立一個自定義字符
- void LCDPrintNum(uint num,uchar wei); //顯示數字
- /*******************************************************************************
- * 函 數 名 : Lcd1602_Delay1ms
- * 函數功能 : 延時函數,延時1ms
- * 輸 入 : c
- * 輸 出 : 無
- * 說 名 : 該函數是在12MHZ晶振下,12分頻單片機的延時。
- *******************************************************************************/
- 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--);
- }
- }
- }
- /*******************************************************************************
- * 函 數 名 : LCD1602_DATAPINS
- * 函數功能 : 更改74HC595連接LCD1602的數據
- * 輸 入 : value
- * 輸 出 : 無
- 74HC595傳送數據的常用寫法
- *******************************************************************************/
- void LCD1602_DATAPINS(uchar value)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- LCD1602_DS=value&0x80;//取數據高位
- if(LCD1602_DS==0x80){ //判斷數據高位是否為1
- LCD1602_DS=1;//如果高位為1,DS置1
- }
- else{
- LCD1602_DS=0;//否則DS置0
- }
- LCD1602_SHCP=0;
- LCD1602_SHCP=1;//上升沿使這一位寫入移位寄存器
- value<<=1;//數據左移1位,數據的第7位變為最高位,循環第8次時數據的最低位也變成最高位
- }
- LCD1602_STCP=0;
- LCD1602_STCP=1;//給STCP一個上升沿,將for循環中輸入的數據移入輸出鎖存寄存器,刷新輸出數據
- }
- void LcdWriteCom(uchar com) //寫入命令
- {
- //LcdCalc(com>>4); //發送高四位
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
51hei.png (11.8 KB, 下載次數: 53)
下載附件
2022-11-27 17:00 上傳
Keil代碼與Proteus仿真下載:
利用可位尋址變量-hc595-1602.zip
(102.37 KB, 下載次數: 30)
2022-11-27 16:33 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|