久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2472|回復: 3
打印 上一主題 下一主題
收起左側

STC15F2K60S2最小系統加pcf8591程序 +lcd1602液晶顯示程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:583118 發表于 2019-7-24 15:49 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #include <STC15F2K60S2.h>
  2. #include <iic.h>
  3. void Timer0Init(void)  //1毫秒@11.0592MHz
  4. {
  5. AUXR |= 0x80;  //定時器時鐘1T模式
  6. TMOD &= 0xF0;  //設置定時器模式
  7. TL0 = 0xCD;  //設置定時初值
  8. TH0 = 0xD4;  //設置定時初值
  9. TF0 = 0;  //清除TF0標志
  10. TR0 = 1;  //定時器0開始計時
  11. EA =1 ;
  12. ET0=1;
  13. }

  14. bit flag500ms = 0;   

  15. unsigned char code str1[] = "Kingst Studio";
  16. unsigned char code str2[] = "Let's move...";
  17. extern void InitLcd1602();
  18. extern void LcdShowStr(unsigned char x, unsigned char y,unsigned char *str, unsigned char len);
  19. void main()
  20. {

  21. unsigned char i = 0;
  22. unsigned char index = 0;
  23. unsigned char pdata bufMove1[16 + sizeof(str1) + 16];
  24. unsigned char pdata bufMove2[16 + sizeof(str2) + 16];
  25. unsigned char adc_val;
  26. unsigned char str[10];
  27. P2=0xa0;P0=0;P2=0;
  28. Timer0Init();
  29.   InitLcd1602();   
  30. write_adc(0x00);
  31. for(i=0; i<16; i++)
  32. {
  33.   bufMove1[i] = ' ';
  34.   bufMove2[i] = ' ';
  35. }
  36. for(i=0; i<(sizeof(str1)-1); i++)
  37. {
  38.   bufMove1[16 + i] = str1[i];
  39.   bufMove2[16 + i] = str2[i];
  40. }
  41. for(i=(16 + sizeof(str1)-1); i<sizeof(bufMove1); i++)
  42. {
  43.   bufMove1[i] = ' ';
  44.   bufMove2[i] = ' ';
  45. }
  46.   while (1)
  47.     {
  48.         if (flag500ms)  //??500msò??ˉò?′??á??
  49.         {
  50.       flag500ms = 0;
  51.        adc_val=read_adc(0x00);
  52.      str[0] = adc_val/100+'0';
  53.      str[1] = adc_val/10%10+'0';
  54.      str[2] = adc_val%10+'0';
  55. //     LcdShowStr(0,0,str,3);
  56.      
  57.      
  58.      LcdShowStr(0, 0, bufMove1 + index, 16);
  59.      LcdShowStr(0, 1, bufMove2 + index, 16);
  60.      index++;
  61.     if(index >= (16 + sizeof(str1)-1))
  62.     {
  63.      index = 0;
  64.      }
  65.   }
  66. }
  67. }

  68. void InterruptTimer0() interrupt 1
  69. {
  70.     static unsigned int tmr500ms = 0;
  71.    
  72.     tmr500ms++;
  73.     if (tmr500ms >= 500)
  74.     {
  75.         tmr500ms = 0;
  76.         flag500ms = 1;
  77.     }
  78. }#include <STC15F2K60S2.h>
  79. #include <iic.h>
  80. void Timer0Init(void)  //1毫秒@11.0592MHz
  81. {
  82. AUXR |= 0x80;  //定時器時鐘1T模式
  83. TMOD &= 0xF0;  //設置定時器模式
  84. TL0 = 0xCD;  //設置定時初值
  85. TH0 = 0xD4;  //設置定時初值
  86. TF0 = 0;  //清除TF0標志
  87. TR0 = 1;  //定時器0開始計時
  88. EA =1 ;
  89. ET0=1;
  90. }

  91. bit flag500ms = 0;   

  92. unsigned char code str1[] = "Kingst Studio";
  93. unsigned char code str2[] = "Let's move...";
  94. extern void InitLcd1602();
  95. extern void LcdShowStr(unsigned char x, unsigned char y,unsigned char *str, unsigned char len);
  96. void main()
  97. {

  98. unsigned char i = 0;
  99. unsigned char index = 0;
  100. unsigned char pdata bufMove1[16 + sizeof(str1) + 16];
  101. unsigned char pdata bufMove2[16 + sizeof(str2) + 16];
  102. unsigned char adc_val;
  103. unsigned char str[10];
  104. P2=0xa0;P0=0;P2=0;
  105. Timer0Init();
  106.   InitLcd1602();   
  107. write_adc(0x00);
  108. for(i=0; i<16; i++)
  109. {
  110.   bufMove1[i] = ' ';
  111.   bufMove2[i] = ' ';
  112. }
  113. for(i=0; i<(sizeof(str1)-1); i++)
  114. {
  115.   bufMove1[16 + i] = str1[i];
  116.   bufMove2[16 + i] = str2[i];
  117. }
  118. for(i=(16 + sizeof(str1)-1); i<sizeof(bufMove1); i++)
  119. {
  120.   bufMove1[i] = ' ';
  121.   bufMove2[i] = ' ';
  122. }
  123.   while (1)
  124.     {
  125.         if (flag500ms)  //??500msò??ˉò?′??á??
  126.         {
  127.       flag500ms = 0;
  128.        adc_val=read_adc(0x00);
  129.      str[0] = adc_val/100+'0';
  130.      str[1] = adc_val/10%10+'0';
  131.      str[2] = adc_val%10+'0';
  132. //     LcdShowStr(0,0,str,3);
  133.      
  134.      
  135.      LcdShowStr(0, 0, bufMove1 + index, 16);
  136.      LcdShowStr(0, 1, bufMove2 + index, 16);
  137.      index++;
  138.     if(index >= (16 + sizeof(str1)-1))
  139.     {
  140.      index = 0;
  141.      }
  142.   }
  143. }
  144. }

  145. void InterruptTimer0() interrupt 1
  146. {
  147.     static unsigned int tmr500ms = 0;
  148.    
  149.     tmr500ms++;
  150.     if (tmr500ms >= 500)
  151.     {
  152.         tmr500ms = 0;
  153.         flag500ms = 1;
  154.     }
  155. }




  156. #include <reg52.h>
  157. #define LCD1602_DB  P0
  158. sbit LCD1602_RS = P2^0;
  159. sbit LCD1602_RW = P2^1;
  160. sbit LCD1602_E  = P1^2;
  161. /* 等待液晶準備好 */
  162. void LcdWaitReady()
  163. {
  164.     unsigned char sta;
  165.    
  166.     LCD1602_DB = 0xFF;
  167.     LCD1602_RS = 0;
  168.     LCD1602_RW = 1;
  169.     do {
  170.         LCD1602_E = 1;
  171.         sta = LCD1602_DB; //讀取狀態字
  172.         LCD1602_E = 0;
  173.     } while (sta & 0x80); //bit7等于1表示液晶正忙,重復檢測直到其等于0為止
  174. }
  175. /* 向LCD1602液晶寫入一字節命令,cmd-待寫入命令值 */
  176. void LcdWriteCmd(unsigned char cmd)
  177. {
  178.     LcdWaitReady();
  179.     LCD1602_RS = 0;
  180.     LCD1602_RW = 0;
  181.     LCD1602_DB = cmd;
  182.     LCD1602_E  = 1;
  183.     LCD1602_E  = 0;
  184. }
  185. /* 向LCD1602液晶寫入一字節數據,dat-待寫入數據值 */
  186. void LcdWriteDat(unsigned char dat)
  187. {
  188.     LcdWaitReady();
  189.     LCD1602_RS = 1;
  190.     LCD1602_RW = 0;
  191.     LCD1602_DB = dat;
  192.     LCD1602_E  = 1;
  193.     LCD1602_E  = 0;
  194. }
  195. /* 設置顯示RAM起始地址,亦即光標位置,(x,y)-對應屏幕上的字符坐標 */
  196. void LcdSetCursor(unsigned char x, unsigned char y)
  197. {
  198.     unsigned char addr;
  199.    
  200.     if (y == 0)  //由輸入的屏幕坐標計算顯示RAM的地址
  201.         addr = 0x00 + x;  //第一行字符地址從0x00起始
  202.     else
  203.         addr = 0x40 + x;  //第二行字符地址從0x40起始
  204.     LcdWriteCmd(addr | 0x80);  //設置RAM地址
  205. }
  206. /* 在液晶上顯示字符串,(x,y)-對應屏幕上的起始坐標,
  207.    str-字符串指針,len-需顯示的字符長度 */
  208. void LcdShowStr(unsigned char x, unsigned char y,
  209.                 unsigned char *str, unsigned char len)
  210. {
  211.     LcdSetCursor(x, y);   //設置起始地址
  212.     while (len--)         //連續寫入len個字符數據
  213.     {
  214.         LcdWriteDat(*str++);  //先取str指向的數據,然后str自加1
  215.     }
  216. }
  217. /* 初始化1602液晶 */
  218. void InitLcd1602()
  219. {
  220.     LcdWriteCmd(0x38);  //16*2顯示,5*7點陣,8位數據接口
  221.     LcdWriteCmd(0x0C);  //顯示器開,光標關閉
  222.     LcdWriteCmd(0x06);  //文字不動,地址自動+1
  223.     LcdWriteCmd(0x01);  //清屏
  224. }


  225. #ifndef _IIC_H
  226. #define _IIC_H
  227. //函數聲明
  228. void IIC_Start(void);
  229. void IIC_Stop(void);  
  230. void IIC_Ack(bit ackbit);
  231. void IIC_SendByte(unsigned char byt);
  232. bit IIC_WaitAck(void);  
  233. unsigned char IIC_RecByte(void);
  234. void write_adc(unsigned char add);
  235. unsigned char read_adc(unsigned char add);

  236. #endif



  237. /*
  238.   程序說明: IIC總線驅動程序
  239.   軟件環境: Keil uVision 4.10
  240.   硬件環境: CT107單片機綜合實訓平臺 8051,12MHz
  241.   日    期: 2011-8-9
  242. */
  243. #include "reg52.h"
  244. #include "intrins.h"
  245. #define DELAY_TIME 12
  246. #define SlaveAddrW 0xA0
  247. #define SlaveAddrR 0xA1
  248. //總線引腳定義
  249. sbit SDA = P2^1;  /* 數據線 */
  250. sbit SCL = P2^0;  /* 時鐘線 */
  251. void IIC_Delay(unsigned char i)
  252. {
  253.     do{_nop_();}
  254.     while(i--);        
  255. }
  256. //總線啟動條件
  257. void IIC_Start(void)
  258. {
  259.     SDA = 1;
  260.     SCL = 1;
  261.     IIC_Delay(DELAY_TIME);
  262.     SDA = 0;
  263.     IIC_Delay(DELAY_TIME);
  264.     SCL = 0;
  265. }
  266. //總線停止條件
  267. void IIC_Stop(void)
  268. {
  269.     SDA = 0;
  270.     SCL = 1;
  271.     IIC_Delay(DELAY_TIME);
  272.     SDA = 1;
  273.     IIC_Delay(DELAY_TIME);
  274. }
  275. //發送應答
  276. void IIC_SendAck(bit ackbit)
  277. {
  278.     SCL = 0;
  279.     SDA = ackbit;       // 0:應答,1:非應答
  280.     IIC_Delay(DELAY_TIME);
  281.     SCL = 1;
  282.     IIC_Delay(DELAY_TIME);
  283.     SCL = 0;
  284.     SDA = 1;
  285.     IIC_Delay(DELAY_TIME);
  286. }
  287. //等待應答
  288. bit IIC_WaitAck(void)
  289. {
  290.     bit ackbit;

  291.     SCL  = 1;
  292.     IIC_Delay(DELAY_TIME);
  293.     ackbit = SDA;
  294.     SCL = 0;
  295.     IIC_Delay(DELAY_TIME);
  296.     return ackbit;
  297. }
  298. //通過I2C總線發送數據
  299. void IIC_SendByte(unsigned char byt)
  300. {
  301.     unsigned char i;
  302.     for(i=0; i<8; i++)
  303.     {
  304.         SCL  = 0;
  305.         IIC_Delay(DELAY_TIME);
  306.         if(byt & 0x80) SDA  = 1;
  307.         else SDA  = 0;
  308.         IIC_Delay(DELAY_TIME);
  309.         SCL = 1;
  310.         byt <<= 1;
  311.         IIC_Delay(DELAY_TIME);
  312.     }
  313.     SCL  = 0;  
  314. }
  315. //從I2C總線上接收數據
  316. unsigned char IIC_RecByte(void)
  317. {
  318.     unsigned char i, da;
  319.     for(i=0; i<8; i++)
  320.     {   
  321.      SCL = 1;
  322. IIC_Delay(DELAY_TIME);
  323. da <<= 1;
  324. if(SDA) da |= 1;
  325. SCL = 0;
  326. IIC_Delay(DELAY_TIME);
  327.     }
  328.     return da;   
  329. }

  330. void write_adc(unsigned char add)
  331. {
  332. IIC_Start();
  333. IIC_SendByte(0x90);
  334. IIC_WaitAck();
  335. IIC_SendByte(add);
  336. IIC_WaitAck();
  337. IIC_Stop();
  338. }
  339. unsigned char read_adc(unsigned char add)
  340. {
  341. unsigned char temp;
  342. IIC_Start();
  343. IIC_SendByte(0x90);
  344. IIC_WaitAck();
  345. IIC_SendByte(add);
  346. IIC_WaitAck();
  347. IIC_Start();
  348. IIC_SendByte(0x91);
  349. IIC_WaitAck();
  350. temp=IIC_RecByte();
  351. IIC_WaitAck();
  352. IIC_Stop();
  353. return temp;
  354. }
復制代碼

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩1
回復

使用道具 舉報

沙發
ID:1 發表于 2019-7-24 16:48 | 只看該作者
補全原理圖或者詳細說明一下電路連接即可獲得100+黑幣
回復

使用道具 舉報

板凳
ID:276663 發表于 2020-3-20 10:38 | 只看該作者
好像看看效果
回復

使用道具 舉報

地板
ID:614901 發表于 2020-7-25 13:15 | 只看該作者
1602讀寫程序里不用做延時也可以顯示嗎?  STC15的速度不是快于1602嗎?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美自拍视频 | 国产精品久久久精品 | 欧美精品在线一区 | 亚洲一区二区欧美 | 国产精品99999999 | 亚洲美女一区 | 日韩黄a | 人人叉| 真人女人一级毛片免费播放 | 九一在线观看 | 久久精品国产一区二区电影 | 中文字幕一区二区三区在线观看 | 五月激情综合 | 中文字幕一区二区三区日韩精品 | 亚洲人成一区二区三区性色 | 午夜亚洲 | 天天操天天干天天曰 | 亚洲精品久久久一区二区三区 | 成人精品一区二区 | 99国产精品视频免费观看一公开 | 在线高清免费观看视频 | 亚洲精品国产第一综合99久久 | 不卡av在线 | 日韩欧美高清dvd碟片 | 黄色欧美大片 | 欧美一区二 | 欧美精品在线播放 | 亚洲播放一区 | 亚洲在线一区二区 | 在线一区观看 | 91在线精品播放 | 免费久久网站 | 成人在线观看免费 | 美女黄网| 射久久 | 亚洲精品视频观看 | 国产一区二区三区久久久久久久久 | 欧美视频精品 | 91高清视频在线观看 | 亚洲欧美精品 | 一级毛片在线看 |