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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機io口模擬串口 1602顯示數據位內容

[復制鏈接]
跳轉到指定樓層
樓主
ID:72705 發表于 2015-1-24 15:25 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
一個項目的一部分內容,讓初學者模擬著做一下,還是很有用處的。

這樣的程序可以實現一個51單片機有兩個串口
  1. #include<regx52.h>

  2. sbit BT_SND =P1^1;
  3. sbit BT_REC =P1^0;

  4. //1602部分引腳定義
  5. sbit LCM_RW =P2^1 ;//定義引腳
  6. sbit LCM_RS =P2^0;
  7. sbit LCM_E =P2^2;
  8. #define LCM_Data P0
  9. #define Busy 0x80 //用于檢測LCM狀態字中的Busy標識

  10. #define F_TM F0

  11. #define TIMER0_ENABLE   TL0=TH0; TR0=1;
  12. #define TIMER0_DISABLE TR0=0;

  13. void WriteDataLCM(unsigned char WDLCM);
  14. void WriteCommandLCM(unsigned char WCLCM,BuysC);
  15. unsigned char ReadDataLCM(void);
  16. unsigned char ReadStatusLCM(void);
  17. void LCMInit(void);
  18. void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
  19. void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
  20. void Delay5Ms(void);
  21. void Delay400Ms(void);

  22. unsigned char code qq[] = {"Receive_Data"};
  23. //unsigned char code tel[] = {"Command:"};

  24. sbit ACC0=    ACC^0;
  25. sbit ACC1=    ACC^1;
  26. sbit ACC2=    ACC^2;
  27. sbit ACC3=    ACC^3;
  28. sbit ACC4=    ACC^4;
  29. sbit ACC5=    ACC^5;
  30. sbit ACC6=    ACC^6;
  31. sbit ACC7=    ACC^7;

  32. void IntTimer0() interrupt 1
  33. {
  34. F_TM=1;
  35. }

  36. //發送一個字符
  37. void PSendChar(unsigned char inch)
  38. {
  39. ACC=inch;

  40. F_TM=0;
  41. BT_SND=0; //start bit
  42. TIMER0_ENABLE; //啟動
  43. while(!F_TM);

  44. BT_SND=ACC0; //先送出低位
  45. F_TM=0;
  46. while(!F_TM);

  47. BT_SND=ACC1;
  48. F_TM=0;
  49. while(!F_TM);

  50. BT_SND=ACC2;
  51. F_TM=0;
  52. while(!F_TM);

  53. BT_SND=ACC3;
  54. F_TM=0;
  55. while(!F_TM);

  56. BT_SND=ACC4;
  57. F_TM=0;
  58. while(!F_TM);

  59. BT_SND=ACC5;
  60. F_TM=0;
  61. while(!F_TM);

  62. BT_SND=ACC6;
  63. F_TM=0;
  64. while(!F_TM);

  65. BT_SND=ACC7;
  66. F_TM=0;
  67. while(!F_TM);


  68. BT_SND=1;
  69. F_TM=0;
  70. while(!F_TM);


  71. TIMER0_DISABLE; //停止timer


  72. }

  73. //接收一個字符
  74. unsigned char PGetChar()
  75. {
  76. TIMER0_ENABLE;
  77. F_TM=0;
  78. while(!F_TM); //等過起始位
  79. ACC0=BT_REC;

  80. TL0=TH0;

  81. F_TM=0;
  82. while(!F_TM);
  83. ACC1=BT_REC;

  84. F_TM=0;
  85. while(!F_TM);
  86. ACC2=BT_REC;

  87. F_TM=0;
  88. while(!F_TM);
  89. ACC3=BT_REC;

  90. F_TM=0;
  91. while(!F_TM);
  92. ACC4=BT_REC;

  93. F_TM=0;
  94. while(!F_TM);
  95. ACC5=BT_REC;

  96. F_TM=0;
  97. while(!F_TM);
  98. ACC6=BT_REC;

  99. F_TM=0;
  100. while(!F_TM);
  101. ACC7=BT_REC;


  102. F_TM=0;

  103. while(!F_TM)
  104. {
  105. if(BT_REC)
  106. {
  107. break;
  108. }
  109. }
  110. TIMER0_DISABLE; //停止timer
  111. return ACC;


  112. }
  113. //檢查是不是有起始位
  114. bit StartBitOn()
  115. {
  116. return(BT_REC==0);

  117. }
  118. void main()
  119. {
  120. unsigned char gch,i;

  121. TMOD=0x22; /*定時器1為工作模式2(8位自動重裝),0為模式2(8位自動重裝) */

  122. PCON=00;

  123. TR0=0; //在發送或接收才開始使用
  124. TF0=0;
  125. TH0=(256-96); //9600bps 就是 1000000/9600=104.167微秒 執行的timer是104.167*11.0592/12= 96

  126. //            

  127. TL0=TH0;
  128. ET0=1;
  129. EA=1;
  130. Delay400Ms(); //啟動等待,等LCM講入工作狀態
  131.    LCMInit(); //LCM初始化
  132.    Delay5Ms(); //延時片刻(可不要)
  133.    DisplayListChar(2, 0, qq);
  134. //    DisplayListChar(0, 1, tel);
  135.    // ReadDataLCM();//測試用句無意義
  136. PSendChar(0x55);
  137. PSendChar(0xaa);
  138. PSendChar(0x00);
  139. PSendChar(0xff);

  140. while(1)
  141. {


  142. if(StartBitOn())
  143.    {
  144.    gch=PGetChar();
  145.    PSendChar(gch);
  146.    for(i=0;i<8;i++)
  147.       DisplayOneChar(7-i,1, ((gch>>i)&0x01)+48);
  148.   
  149.     }
  150. }
  151. }


  152. //寫數據
  153. void WriteDataLCM(unsigned char WDLCM)
  154. {
  155. ReadStatusLCM(); //檢測忙
  156. LCM_Data = WDLCM;
  157. LCM_RS = 1;
  158. LCM_RW = 0;
  159. LCM_E = 0; //若晶振速度太高可以在這后加小的延時
  160. LCM_E = 0; //延時
  161. LCM_E = 1;
  162. }

  163. //寫指令
  164. void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC為0時忽略忙檢測
  165. {
  166. if (BuysC) ReadStatusLCM(); //根據需要檢測忙
  167. LCM_Data = WCLCM;
  168. LCM_RS = 0;
  169. LCM_RW = 0;
  170. LCM_E = 0;
  171. LCM_E = 0;
  172. LCM_E = 1;
  173. }

  174. /*/讀數據
  175. unsigned char ReadDataLCM(void)
  176. {
  177. LCM_RS = 1;
  178. LCM_RW = 1;
  179. LCM_E = 0;
  180. LCM_E = 0;
  181. LCM_E = 1;
  182. return(LCM_Data);
  183. }
  184. */
  185. //讀狀態
  186. unsigned char ReadStatusLCM(void)
  187. {
  188. LCM_Data = 0xFF;
  189. LCM_RS = 0;
  190. LCM_RW = 1;
  191. LCM_E = 0;
  192. LCM_E = 0;
  193. LCM_E = 1;
  194. while (LCM_Data & Busy); //檢測忙信號
  195. return(LCM_Data);
  196. }

  197. void LCMInit(void) //LCM初始化
  198. {
  199. LCM_Data = 0;
  200. WriteCommandLCM(0x38,0); //三次顯示模式設置,不檢測忙信號
  201. Delay5Ms();
  202. WriteCommandLCM(0x38,0);
  203. Delay5Ms();
  204. WriteCommandLCM(0x38,0);
  205. Delay5Ms();

  206. WriteCommandLCM(0x38,1); //顯示模式設置,開始要求每次檢測忙信號
  207. WriteCommandLCM(0x08,1); //關閉顯示
  208. WriteCommandLCM(0x01,1); //顯示清屏
  209. WriteCommandLCM(0x06,1); // 顯示光標移動設置
  210. WriteCommandLCM(0x0C,1); // 顯示開及光標設置
  211. }

  212. //按指定位置顯示一個字符
  213. void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
  214. {
  215. Y &= 0x1;
  216. X &= 0xF; //限制X不能大于15,Y不能大于1
  217. if (Y) X |= 0x40; //當要顯示第二行時地址碼+0x40;
  218. X |= 0x80; //算出指令碼
  219. WriteCommandLCM(X, 0); //這里不檢測忙信號,發送地址碼
  220. WriteDataLCM(DData);
  221. }

  222. //按指定位置顯示一串字符
  223. void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
  224. {
  225. unsigned char ListLength;

  226. ListLength = 0;
  227. Y &= 0x1;
  228. X &= 0xF; //限制X不能大于15,Y不能大于1
  229. while (DData[ListLength]>0x20) //若到達字串尾則退出
  230. {
  231. if (X <= 0xF) //X坐標應小于0xF
  232. {
  233. DisplayOneChar(X, Y, DData[ListLength]); //顯示單個字符
  234. ListLength++;
  235. X++;
  236. }
  237. }
  238. }

  239. //5ms延時
  240. void Delay5Ms(void)
  241. {
  242. unsigned int TempCyc = 5552;
  243. while(TempCyc--);
  244. }

  245. //400ms延時
  246. void Delay400Ms(void)
  247. {
  248. unsigned char TempCycA = 5;
  249. unsigned int TempCycB;
  250. while(TempCycA--)
  251. {
  252. TempCycB=7269;
  253. while(TempCycB--);
  254. };
  255. }
復制代碼



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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 男人av网| 毛片a级| 亚洲视频免费在线看 | 国产黄色在线观看 | 亚洲国产aⅴ成人精品无吗 欧美激情欧美激情在线五月 | 午夜精品一区二区三区在线播放 | 黄网免费 | 国产激情在线观看 | 欧美高清性xxxxhdvideosex | 成人黄色电影免费 | 毛片一区二区 | 日本在线看片 | 艹逼网| 91一区二区三区在线观看 | 亚洲精品 在线播放 | 99久久精品免费 | 日本一级淫片免费啪啪3 | av永久| 操久久| 成人精品一区二区三区中文字幕 | 成人免费视频网站在线看 | 免费在线观看一区二区三区 | 久久国产精品-久久精品 | 亚洲一区有码 | 99在线国产 | 美女天天操 | 亚洲精品4 | 大香在线伊779 | 国产精品免费大片 | 久久骚| a级黄色毛片免费播放视频 国产精品视频在线观看 | 国产精品黄色 | 涩涩视频网站在线观看 | 国产精品完整版 | 国产精品一区二区三区四区 | 成年人黄色小视频 | 亚洲免费一 | 亚洲美乳中文字幕 | www.亚洲国产精品 | 欧美伊人 | av网站观看 |