找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1916|回复: 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. }
复制代码

回复

使用道具 举报

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 单片机教程网

快速回复 返回顶部 返回列表