1. #include<reg52.h>
  2. typedef unsigned char uint8;
  3. typedef unsigned int uint16;
  4.  
  5. sbit rw=P2^;
  6. sbit rs=P2^;
  7. sbit e=P2^;
  8. sbit led=P3^;
  9.  
  10. uint8 key,num,ei,eii,p;
  11. uint8 fuhao;//定义具体的那个符号,是加减还是乘除。
  12. uint8 flag; //定义有没有按下符号键,这个是统称
  13. long a,b,c,d; //定义运算数据的第一个和第二个及等于的数变量
  14. uint8 k; //定义小数点后面显示的位数
  15.  
  16. uint8 dat1[]={,,,0x2b-0x30, ,,,0x2d-0x30, ,,,0x2a-0x30,
  17. ,0x01-0x30,0x3d-0x30,0x2b-0x30 };//保存显示的数据
  18. uint8 dat2[]="9999 revo rewsna";
  19. uint8 dat3[]="Hi welcome into";
  20. uint8 dat4[]="counter by yumo";
  21. void delay(uint16 i)
  22. {
  23. while(i--);
  24. }
  25. void lcdwrc(uint8 c)//写入命令
  26. {
  27. delay();
  28. rs=;//选择发送命令
  29. rw=;//选择写入
  30. e=;//使能
  31.  
  32. P0=c;//放入命令
  33. e=;//写时序
  34. delay();//保持时间
  35. e=;
  36. }
  37. void lcdwrd(uint8 dat)//写入数据
  38. {
  39. delay();
  40. rs=;//选择输入数据
  41. rw=;//选择写入
  42. e=;
  43.  
  44. P0=dat;//写入数据
  45. e=;//写入时序
  46. delay();
  47. e=;
  48. rs=;
  49. }
  50.  
  51. void lcdinit()//LCD初始化
  52. {
  53. delay();
  54. lcdwrc(0x38);
  55. delay();
  56. lcdwrc(0x38);
  57. delay();
  58. lcdwrc(0x38);
  59. delay();
  60. lcdwrc(0x38);
  61. lcdwrc(0x08);
  62. lcdwrc(0x01);
  63. lcdwrc(0x06);
  64. lcdwrc(0x0c);
  65. key=;
  66. num=;
  67. flag=;
  68. fuhao=;
  69. a=;
  70. b=;
  71. c=;
  72. d=;
  73. led=;
  74. }
  75.  
  76. show()
  77. {
  78. for(eii=;eii<;eii++)
  79. {
  80.  
  81. lcdwrd(dat3[eii]);
  82. }
  83. lcdwrc(0xc0);//写命令函数使其到第二行第一个字符
  84. for(p=;p<;p++)
  85. {
  86.  
  87. lcdwrd(dat4[p]);
  88. }
  89. return ;
  90. }
  91. void keyscan()
  92. {
  93. P1=0xfe; //令第一行为0,然后判断是哪一列按下
  94. if(P1!=0xfe)
  95. {
  96. delay();
  97. if(P1!=0xfe)
  98. {
  99. key=P1&0xf0;
  100. switch(key)
  101. {
  102. case 0xe0: num=;break; //
  103. case 0xd0: num=;break; //
  104. case 0xb0: num=;break; //
  105. case 0x70: num=;break; //加
  106. }
  107. }
  108. while(P1!=0xfe);
  109. if(num==||num==||num==) //确认第一行的数1,2,3
  110. {
  111. if(flag==) //没有按下符号键
  112. {
  113. led=;
  114. a=a*+dat1[num];
  115. }
  116. else
  117. {
  118. led=;
  119. delay();
  120. led=;
  121. delay();
  122. led=;
  123. b=b*+dat1[num];
  124. }
  125. }
  126. if(num==)
  127. {
  128. led=;
  129. flag=;
  130. fuhao=;//加号+
  131. }
  132. lcdwrd(0x30+dat1[num]);
  133. }
  134.  
  135. P1=0xfd; //令第二行为0,判断是哪一列按下
  136. if(P1!=0xfd)
  137. {
  138. delay();
  139. if(P1!=0xfd)
  140. {
  141. key=P1&0xf0;
  142. switch(key)
  143. {
  144. case 0xe0: num=;break; //
  145. case 0xd0: num=;break; //
  146. case 0xb0: num=;break; //
  147. case 0x70: num=;break; //减—
  148. }
  149. }
  150. while(P1!=0xfd);
  151. if(num==||num==||num==)
  152. {
  153. if(flag==) //没有按下符号键
  154. {
  155. led=;
  156. a=a*+dat1[num];
  157. }
  158. else
  159. {
  160. led=;
  161. b=b*+dat1[num];
  162. }
  163. }
  164. else
  165. {
  166. led=;
  167. flag=;
  168. fuhao=;//带表减号
  169. }
  170. lcdwrd(0x30+dat1[num]);
  171. }
  172.  
  173. P1=0xfb; //令第三行为0,判断哪一列按下
  174. if(P1!=0xfb)
  175. {
  176. delay();
  177. if(P1!=0xfb)
  178. {
  179. key=P1&0xf0;
  180. switch(key)
  181. {
  182. case 0xe0: num=;break; //
  183. case 0xd0: num=;break; //
  184. case 0xb0: num=;break; //
  185. case 0x70: num=;break; //乘*
  186. }
  187. }
  188. while(P1!=0xfb);
  189. if(num==||num==||num==)
  190. {
  191. if(flag==) //没有按下符号键
  192. {
  193. led=;
  194. a=a*+dat1[num];
  195. }
  196. else
  197. {
  198. led=;
  199. b=b*+dat1[num];
  200. }
  201. }
  202. else
  203. {
  204. led=;
  205. flag=;
  206. fuhao=;//带表乘号*
  207. }
  208. lcdwrd(0x30+dat1[num]);
  209. }
  210.  
  211. P1=0xf7; //令第四行为0,判断哪一列按下
  212. if(P1!=0xf7)
  213. {
  214. delay();
  215. if(P1!=0xf7)
  216. {
  217. key=P1&0xf0;
  218. switch(key)
  219. {
  220. case 0xe0: num=;break; //
  221. case 0xd0: num=;break; //清除rst
  222. case 0xb0: num=;break; //等号=
  223. case 0x70: num=;break; //除/
  224. }
  225. }
  226. while(P1!=0xf7);
  227. switch(num)
  228. {
  229. case :
  230. if(flag==) //没有按下符号键
  231. {
  232. led=;
  233. a=a*+dat1[num];
  234. lcdwrd(0x30);
  235. }
  236. else
  237. {
  238. led=;
  239. b=b*+dat1[num];
  240. lcdwrd(0x30);
  241. }
  242. break;
  243. case :
  244. lcdwrc(0x01); //清屏指令
  245. a=;
  246. b=;
  247. c=;
  248. flag=;
  249. fuhao=;
  250. break;
  251. case :
  252.  
  253. led=;
  254. flag=;
  255. fuhao=;
  256. lcdwrd(0x2f);//除号/
  257. break;
  258. case : //如果是等于号
  259. if(fuhao==)//加
  260. {
  261. lcdwrc(0x4f+0x80);
  262. lcdwrc(0x04);//设置光标左移,屏幕不移动
  263. c=a+b;
  264.  
  265. if(c==)
  266. {
  267. lcdwrc(0x4f+0x80);
  268. lcdwrc(0x04);
  269. lcdwrd(0x30);
  270. }
  271. while((c!=)&&(c<=)) //一位一位显示
  272. {
  273.  
  274. lcdwrd(0x30+c%);//显示结果的最后一位在0x4f的位置
  275. c=c/;//取前面的结果数据
  276. }
  277. if(c>)
  278. {
  279. for(ei=;ei<=;ei++)
  280. {
  281. lcdwrd(dat2[ei]);
  282. }
  283. }
  284. lcdwrd(0x3d); //显示等于号=
  285. a=;
  286. b=;
  287. c=;
  288. flag=;
  289. fuhao=;//全部清除为0
  290. }
  291. if(fuhao==) //减
  292. {
  293. lcdwrc(0x4f+0x80);
  294. lcdwrc(0x04);//设置光标左移,屏幕不移动
  295. if(a>b)
  296. c=a-b;
  297. else
  298. c=b-a;
  299.  
  300. if((c==))//此语句位置影响显示
  301. {
  302. lcdwrc(0x4f+0x80);
  303. lcdwrc(0x04);
  304. lcdwrd(0x30);
  305. }
  306. while((c!=)&&(c<=)) //一位一位显示
  307. {
  308. lcdwrd(0x30+c%);//显示结果的最后一位在0x4f的位置
  309. c=c/;//取前面的结果数据
  310. }
  311. if(c>)
  312. {
  313. for(ei=;ei<=;ei++)
  314. {
  315. lcdwrd(dat2[ei]);
  316. }
  317. }
  318. if(a<b) lcdwrd(0x2d); //显示-号
  319. lcdwrd(0x3d); //显示等于号=
  320. a=;
  321. b=;
  322. flag=;
  323. fuhao=;//全部清除为0
  324. }
  325. if(fuhao==)//乘法
  326. {
  327. lcdwrc(0x4f+0x80);
  328. lcdwrc(0x04);//设置光标左移,屏幕不移动
  329. c=a*b;
  330. while((c!=)&(c<=)) //一位一位显示
  331. {
  332. lcdwrd(0x30+c%);//显示结果的最后一位在0x4f的位置
  333. c=c/;//取前面的结果数据
  334. }
  335. if (c>)
  336. {
  337. for(ei=;ei<=;ei++)
  338. {
  339. lcdwrd(dat2[ei]);
  340. }
  341. }
  342. if(a==||b==)
  343. {
  344. lcdwrd(0x30);
  345. }
  346. lcdwrd(0x3d); //显示等于号=
  347. a=;
  348. b=;
  349. flag=;
  350. fuhao=;//全部清除为0
  351. }
  352. if(fuhao==)//除法
  353. {
  354. k=;
  355. lcdwrc(0x4f+0x80);
  356. lcdwrc(0x04);//设置光标左移,屏幕不移动
  357. c=(long)(((float)a/b)*);//强制转换为long。
  358. while((c!=)&&(c<=)) //一位一位显示
  359. {
  360. k++;
  361. lcdwrd(0x30+c%);//显示结果的最后一位在0x4f的位置
  362. c=c/;//取前面的结果数据
  363. if(k==)//结果保留四位有效数字
  364. {
  365. lcdwrd(0x2e);//显示一个点
  366. //k=0;//倘若K=0,那么每隔三位就有一个小数点,计算器上的逗号就是这个原理。
  367. }
  368. }
  369. if(c>)
  370. {
  371. for(ei=;ei<=;ei++)
  372. {
  373. lcdwrd(dat2[ei]);
  374. }
  375. }
  376. if(<(a/b)<0.1001)
  377. {
  378. //lcdwrd(0x2e);
  379.  
  380. }
  381. if((a/b)<) //如果a比b小的话那么除的结果最高位是0
  382. {
  383. lcdwrd(0x30);
  384. }
  385. if(b==)//检错因为除数不能为0,否则就显示ERROR
  386. {
  387. lcdwrc(0x4f+0x80);
  388. lcdwrc(0x04);
  389. lcdwrd(0x52);
  390. lcdwrd(0x4f);
  391. lcdwrd(0x52);
  392. lcdwrd(0x52);
  393. lcdwrd(0x45);
  394. }
  395. lcdwrd(0x3d); //显示等号
  396. a=;
  397. b=;
  398. flag=;
  399. fuhao=;//全部清除为0
  400. }
  401. break;
  402. }
  403. }
  404. }
  405. void main()
  406. {
  407. lcdinit();
  408. show();//个性化界面
  409. while()
  410. {
  411. keyscan();
  412. }
  413. }

此程序为51单片机课程设计时所编写,希望可以供大家参考学习。

单片机课程设计-四位加法计算器设计参考程序(c语言)的更多相关文章

  1. 单片机课程设计——课程设计之四位加法计算器(2)(C代码)

    #include<reg52.h> typedef unsigned char uint8; typedef unsigned int uint16; sbit rw=P2^5; sbit ...

  2. 单片机课程设计——《基于AT89S52单片机和DS1302时钟芯片的电子时钟(可蓝牙校准)》

    引言 本设计以AT89S52单片机为控制核心,时钟芯片DS1302提供时钟源,配合LCD1602液晶显示模块,组成基本硬件系统,同时利用HC-05嵌入式蓝牙串口通讯模块,可在手机端进行日期.时间的校准 ...

  3. 单片机课程设计>八音盒

    2017—2018学年度第一学期 <单片机原理及应用>作品考试 八音盒 2017-2018-1<单片机原理及应用>作品设计提交文档 一.作品设计目的 1.利用51单片机的各个部 ...

  4. 用antlr4来实现《按编译原理的思路设计的一个计算器》中的计算器

    上次在公司内部讲<词法分析——使用正则文法>是一次失败的尝试——上午有十几个人在场,下午就只来了四个听众. 本来我还在构思如何来讲“语法分析”的知识呢,但现在看来已不太可能. 这个课程没有 ...

  5. JAVA 图形开发之计算器设计(事件监听机制)

    /*文章中用到的代码只是一部分,需要源码的可通过邮箱联系我 1978702969@qq.com*/ 前段时间刚帮同学用MFC写了个计算器,现在学到JAVA的图形开发,就试着水了一个计算器出来.(可以说 ...

  6. objective-c 一个链式加法计算器实现

    一个链式加法计算器实现思路 1.使用时的效果 Calculate * manger=[Calculate new]; int result=manger.add(123).add(123).sub(1 ...

  7. PPT资料下载 - 问题驱动的软件测试设计:强化测试用例设计

    测试用例设计是整个软件测试过程中非常重要的测试活动,需求规格说明是测试人员开展测试设计的主要参考输入.而在测试实践中基于需求规格说明得到的测试用例,在测试覆盖率.测试效率.测试有效性和测试质量等方面的 ...

  8. .NET Core实战项目之CMS 第九章 设计篇-白话架构设计

    前面两篇文章给大家介绍了我们实战的CMS系统的数据库设计,源码也已经上传到服务器上了.今天我们就好聊聊架构设计,在开始之前先给大家分享一下这几天我一直在听的<从零开始学架构>里面关于架构设 ...

  9. paip.自适应网页设计 跟 响应式 设计的区别跟原理and实践总结

    paip.自适应网页设计 跟 响应式 设计的区别跟原理and实践总结 响应式Web设计(Responsive Web design)的理念是: 1 #-----------自适应布局VS响应式布局 2 ...

随机推荐

  1. Jenkins可持续集成项目搭建——配置邮件

    1.系统管理->系统设置 (1)填写系统管理员邮件地址 (2)填写邮箱配置.发件人邮箱.收件人邮箱 注:1>发件人邮箱地址必须和系统管理员邮箱地址一致 2> 部分邮箱配置输入的不是登 ...

  2. 联想拯救者r720+固态浦科特M8PeGN 的bios 设置

    最近笔记本左边的两个usb3.0接口都坏了,win10 报错usb端口上的电涌 真是一脸蒙B! 然后去打售后电话,说昌平没有售后,需要去海淀黄庄去维修,然后下午就去了那里,维修的人员说硬件坏了,需要1 ...

  3. 像使用数据库一样使用xml

    目录 xml简介 语言结构 tinyxml 下载tinyxml 应用实例 tinyxml的封装 封装源码 实际应用 xml简介 XML 没什么特别的.它仅仅是纯文本而已.有能力处理纯文本的软件都可以处 ...

  4. What You Can Learn from Actifio Logs

    The Actifio services generate many logs, some of which are useful for troubleshooting. This section ...

  5. MQTT研究之EMQ:【SSL证书链验证】

    1. 创建证书链(shell脚本) 客户端证书链关系: rootCA-->chainca1-->chainca2-->chainca3 ca caCert1 caCert2 caCe ...

  6. C# .NET newtonsoft.json 多版本冲突解决

    A.DLL 引用了6.0 的 newtonsoft.json  (V2 运行时),B.DLL 引用了10.0 的 newtonsoft.json (V4 运行时). 可以在.CONFIG RUNTIM ...

  7. 【Leecode】两数相加

    学习了链表结构,链表中元素的访问,对象指针的初始化与赋值,链表的创建(多个节点链接起来),进位计算的表达. 100ms /** * Definition for singly-linked list. ...

  8. 【java】之位运算^,&,<<,>>,<<<,>>>总结

    1.^(亦或运算) ,针对二进制,相同的为0,不同的为1 public static void main(String[] args) { System.out.println("2^3运算 ...

  9. var entsMapLocation = {……}函数

    var entsMapLocation = { global: { $popupCityBox: $(".ents-map-location-popup-box"), isPosi ...

  10. Scrapy实战篇(七)之爬取爱基金网站基金业绩数据

    本篇我们以scrapy+selelum的方式来爬取爱基金网站(http://fund.10jqka.com.cn/datacenter/jz/)的基金业绩数据. 思路:我们以http://fund.1 ...