制作出來的實物圖如下:
IMG_20181103_000856.jpg (1.86 MB, 下載次數: 66)
下載附件
2018-11-3 18:02 上傳
IMG_20181103_000456_HHT.jpg (1.66 MB, 下載次數: 78)
下載附件
2018-11-3 18:02 上傳
IMG_20181103_000735.jpg (1.31 MB, 下載次數: 67)
下載附件
2018-11-3 18:02 上傳
QQ瀏覽器截圖20181103175332.png (25.63 KB, 下載次數: 72)
下載附件
2018-11-3 17:54 上傳
四線八線都可以用,送給需要的
單片機源程序如下:
- #include "stc12c5410ad.h"
- #include "intrins.h"
- #define uchar unsigned char
- #define uint unsigned int
- uchar dis1[]={" welcome "};
- uchar dis2[]={" 4line Mode "};
- /***********************************************************/
- /***********************************************************/
- /***********************************************************/ //
- #define LcdMode4 1 // 選擇4線 為1 則為0
- #define LcdMode8 0 // 選擇8線 為1 則為0
- #define LineMode4 0x28 // zz1d nfxx d=1是8線 d=0是4線 n=0是1行 n=1是2行 f=0是5x7 f=1是5x10
- #define LineMode8 0x38 // zz1d nfxx d=1是8線 d=0是4線 n=0是1行 n=1是2行 f=0是5x7 f=1是5x10
- #define Display_ON 0x0c // zzzz 1dcb d=1開顯示 c=1有光標 b=1光標不閃 顯示開,有光標 不閃
- #define Display_OFF 0x08 // zzzz 1dcb d=1開顯示 c=1有光標 b=1光標不閃 顯示開,有光標 不閃
- #define EntryMode 0x06 // 顯示光標移動設置
- #define LcdClear 0x01 //清屏
- /***********************************************************/
- /*************** LCD1602腳位定義 **************************/
- /***********************************************************/
- #if LcdMode4>0 //4線改這里
- sbit LcdEn = P2^2;
- sbit LcdRs = P2^3;
- sbit LcdRw = P2^5;
- #define lcdDat P3 //xx0000xx
- #endif
- #if LcdMode8>0
- //8線改這里
- sbit LcdEn = P2^7;
- sbit LcdRs = P2^6;
- sbit LcdRw = P2^5;
- #define lcdDat P0
- #endif
- /***********************************************************/
- /***********************************************************/
- /***********************************************************/
- void Lcddelay(uint us){
- uint i;
- for(i=0;i<us;i++){
- _nop_();
- _nop_();
- }
- }
- /***********************************************************/
- /***********************************************************/
- /***********************************************************/
- bit Check_Busy()
- {
- bit result;
- LcdRs = 0;
- LcdRw = 1;
- LcdEn = 1;
- #if LcdMode4>0
- result = (bit)((lcdDat>>2) & 0x80); //檢測P0最高位是否為1
- #endif
- #if LcdMode8>0
- result = (bit)(lcdDat & 0x80); //檢測P0最高位是否為1
- #endif
- LcdEn = 0;
- return result;//返回側忙結果
- }
- void LcdWriteBety(uchar dat1,uchar btey){//btey=1 寫數據 btey=0 寫指令
- // while(Check_Busy()); //LcdRw 不用要屏蔽掉查忙
- if(btey==0){
- LcdRs = 0; }
- else{
- LcdRs = 1; }
- LcdRw = 0;
- #if LcdMode4>0
- LcdEn = 0;
- lcdDat= (dat1>>2)&0x3c; // 1111 1111 先高
- LcdEn = 1;
- // Lcddelay(13); //不用時鐘分頻延時要用 c51不用
- _nop_();
- LcdEn = 0;
- LcdEn = 0;
- lcdDat= (dat1<<2)&0x3c; //再低
- LcdEn = 1;
- // Lcddelay(11); //不用時鐘分頻延時要用 c51不用
- _nop_();
- LcdEn = 0;
- #endif
- #if LcdMode8>0
- lcdDat= dat1;
- LcdEn = 1;
- _nop_();
- LcdEn = 0;
- #endif
- }
- /***********************************************************/
- /***********************************************************/
- /***********************************************************/
- void LcdInit(void){
- #if LcdMode4>0
- LcdWriteBety(LineMode4,0);
- Lcddelay(20);
- LcdWriteBety(LineMode4,0);
-
- #endif
- #if LcdMode8>0
- LcdWriteBety(LineMode8,0);
- Lcddelay(20);
- LcdWriteBety(LineMode8,0);
- #endif
- Lcddelay(20);
- LcdWriteBety(Display_ON,0);
- Lcddelay(10);
- LcdWriteBety(EntryMode,0);
- Lcddelay(10);
- LcdWriteBety(LcdClear,0);
- Lcddelay(10);
- }
- /***********************************************************/
- /***********************************************************/
- /***********************************************************/
- void LcdPos(uchar x,uchar y){
- if(y==1) x=0x80+x-1;
- if(y==2) x=0xc0+x-1;
- LcdWriteBety(x,0);
- }
- /***********************************************************/
- /***********************************************************/
- /***********************************************************/
- void LcdClread(){
- LcdWriteBety(LcdClear,0);
- Lcddelay(1500);
- }
- /***********************************************************/
- /***********************************************************/
- /***********************************************************/
- void WriteStr(uchar x,uchar y,uchar *str){
- LcdPos(x,y);
- while(*str!='\0'){
- LcdWriteBety(*str++,1);
- }
- }
- /***********************************************************/
- /***********************************************************/
- /***********************************************************/
- void LcdStr(uchar x,uchar y,uchar *str,uchar mun){
- uchar i;
- LcdPos(x,y);
- for(i=0;i<mun;i++){
- LcdWriteBety(*str++,1);
- }
- }
- /***********************************************************/
- /***********************************************************/
- /***********************************************************/
- sbit LED=P1^0;
- /***********************************************************/
- /***********************************************************/
- /***********************************************************/
- /***********************************************************/
- /***********************************************************/
- /***********************************************************/
- void main(){
-
- LcdInit();
- LcdClread();
- /****************************************************/
- //測屏代碼
- CLK_DIV=0x02; //時鐘分頻 c51用不上,stc12c5404用
- while(1){
-
- WriteStr(1,1,dis1);
- WriteStr(1,2,dis2);
- LED = ~LED;
-
- }
- }
復制代碼
所有資料51hei提供下載:
4-8line1602.zip
(46.56 KB, 下載次數: 69)
2018-11-3 17:55 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|