当前位置:首页 » 课程大全 » 计算器lcd显示课程设计

计算器lcd显示课程设计

发布时间: 2021-03-12 06:57:26

A. 基于LCD1602液晶显示器课程设计 能显示字母与数字

Q我

B. 请问如何利用51单片机在LCD1602液晶屏上实现一个简单的计算器功能

#include <AT89X52.H>
#include <intrins.h>
#include "lcd_drive.h"
#define uchar unsigned char
#define uint unsigned int

void main()
{
uint key();
void deplay(uchar j_p);
void deplay_s(long a);

uchar i=1;
uchar jp=-1;
uchar flat;
uint a,b;

delay_ms(10);
lcd_init();
lcd_clr();

lcd_wcmd(0x80);

while(1)
{
(jp==-1)
jp=key();

deplay(jp);

switch (jp)
{
case '=': switch(flat)
{
case '+': a+=b; deplay_s(a); break;
case '-': a=b-a; deplay_s(a); break;
case '*': a*=b; deplay_s(a); break;
case '/': a=b/a; deplay_s(a); break;
default:break;
}

break;
case '+':flat='+';b=a;i=0;break;
case '-':flat='-';b=a;i=0;break;
case '*':flat='*';b=a;i=0;break;
case '/':flat='/';b=a;i=0;break;
case 'c':a=0;b=0;lcd_clr();break;
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:a=a*10*i+jp;i=1;break;
}

jp=-1;
}

}

//-------矩阵键盘扫描-------
uint key()
{
uchar h = 0,l = 0;//矩阵行h,列l
uchar j_p;

P3 = 0x0f;
if(P3 != 0x0f)
{
delay_ms( 2 );
if(P3!=0x0f)
{
l = P3 & 0x0f ;
P3 = 0xf0;
h = P3 & 0xf0;
}
}

switch(l | h)
{
case 0x7e:j_p=0;break; //按键0
case 0x7d:j_p=1;break; //按键1
case 0x7b:j_p=2;break; //按键2
case 0x77:j_p=3;break; //按键3
case 0xbe:j_p=4;break; //按键4
case 0xbd:j_p=5;break; //按键5
case 0xbb:j_p=6;break; //按键6
case 0xb7:j_p=7;break; //按键7
case 0xde:j_p=8;break; //按键8
case 0xdd:j_p=9;break; //按键9
case 0xdb:j_p='+';break; //按键a
case 0xd7:j_p='-';break; //按键b
case 0xee:j_p='=';break; //按键Enter
case 0xed:j_p='*';break; //按键c
case 0xeb:j_p='/';break; //按键e
case 0xe7:j_p='c';break; //按键取消
default:return -1;break;
}

P3=0x0f;
while(P3!=0x0f);

return j_p;
}

void deplay(uchar j_p)
{
if(j_p != -1)
{
if(j_p >= 0 && j_p <= 9)
j_p+=48;

lcd_wdat(j_p);
}
}

void deplay_s(long a)
{
int n[10];
uint i=0;
while(a)
{
n[i]=a%10;
a/=10;
i++;
}

while(i)
deplay(n[--i]);
}

C. 怎么用51单片机做液晶显示屏计算器,进行两位简单的计算

^
#defineLCD1602_FLAG
#defineLCD1602_PORTP0
#include<reg51.h>
#include<stddef.h>
#defineucharunsignedchar

sbitlcd1602_rs=P2^0;
sbitlcd1602_e=P2^2;
sbitlcd1602_rw=P2^1;
sbitlcd1602_busy=P0^7;

ucharstr[]="SimpleCalculator";
ucharkeyval,keystr[16];

voiddelay(uchara)
{
uchari;
while(a--)for(i=0;i<120;i++);
}

/*
************************************
*函数名称:lcd1602_CheckBusy()
*函数功能:状态查询
************************************
*/

voidlcd1602_CheckBusy()
{
do
{
lcd1602_busy=1;
lcd1602_rs=0;
lcd1602_rw=1;
lcd1602_e=0;
lcd1602_e=1;
}
while(lcd1602_busy);
}

/*
***************************************
*函数名称:lcd1602_WriteCmd()
*函数功能:写命令
*入口参数:命令字
*出口参数:无
***************************************
*/

voidlcd1602_WriteCmd(constucharcmd)
{
lcd1602_CheckBusy();
lcd1602_rs=0;
lcd1602_rw=0;
lcd1602_e=1;
LCD1602_PORT=cmd;
lcd1602_e=0;
}

/*
*******************************************
*函数名称:lcd1602_WriteData()
*函数功能:写数据
*入口参数:c--待写数据
*出口参数:无
*********************************************
*/

voidlcd1602_WriteData(constucharc)
{
lcd1602_CheckBusy();
lcd1602_rs=1;
lcd1602_rw=0;
lcd1602_e=1;
LCD1602_PORT=c;
lcd1602_e=0;
}

/*
***********************************************
*函数名称:lcd1602_Init()
*函数功能:初始化LCD
*入口参数:无
*出口参数:无
***********************************************
*/

voidlcd1602_Init()
{
lcd1602_WriteCmd(0x38); //显示模式为8位2行5*7点阵
lcd1602_WriteCmd(0x0c);//displayenable,flagenable,flashenable,
lcd1602_WriteCmd(0x06);//flagmovetoright,screendon'tmove
lcd1602_WriteCmd(0x01);//clearscreen
}

/*
************************************************
*函数名称:lcd1602_Display()
*函数功能:字符显示
*入口参数:ptr--字符或字符串指针
*出口参数:无
*说明:用户可通过以下方式来调用:
*1)lcd1602_Display("Hello,world!");
*2)INT8U存储类型txt[]="要显示的字符串";
*或者INT8U存储类型txt[]={'t','x','t',..,''};
*INT8U*ptr;
*ptr=&txt;
*lcd1602_Display(ptr);
*或lcd1602_Display(txt);
*或lcd1602_Display(&txt);
************************************************
*/

voidlcd1602_Display(constuchar*ptr,ucharline)
{
uchardatai=0;
uchar*dataq;

q=ptr;
switch(line)
{
case0:
lcd1602_WriteCmd(0x80);
while(q!=NULL&&(*q!='')&&i<16)
{
lcd1602_WriteData(*q);
q++;
i++;
}
break;
case1:
lcd1602_WriteCmd(0xc0);
while(q!=NULL&&(*q!='')&&i<16)
{
lcd1602_WriteData(*q);
q++;
i++;
}
break;
}
}

ucharkbscan(void)
{
unsignedcharsccode,recode;
P3=0x0f;//发0扫描,列线输入
if((P3&0x0f)!=0x0f)//有键按下
{
delay(20);//延时去抖动
if((P3&0x0f)!=0x0f)
{
sccode=0xef;//逐行扫描初值
while((sccode&0x01)!=0)
{
P3=sccode;
if((P3&0x0f)!=0x0f)
{
recode=(P3&0x0f)|0xf0;
while((P3&0x0f)!=0x0f);//等待键抬起
return((~sccode)+(~recode));
}
else
sccode=(sccode<<1)|0x01;
}
}
}
return0;//无键按下,返回0
}
uchargetkey(void)
{
ucharkey;
key=kbscan();
if(key==0){keyval=0xff;return(0);}
switch(key)
{
case0x11:keyval=7;break;
case0x12:keyval=4;break;
case0x14:keyval=1;break;
case0x18:keyval=10;break;
case0x21:keyval=8;break;
case0x22:keyval=5;break;
case0x24:keyval=2;break;
case0x28:keyval=0;break;
case0x41:keyval=9;break;
case0x42:keyval=6;break;
case0x44:keyval=3;break;
case0x48:keyval=11;break;
case0x81:keyval=12;break;
case0x82:keyval=13;break;
case0x84:keyval=14;break;
case0x88:keyval=15;break;
default:keyval=0xff;break;
}
if(keyval!=0xff)return(1);
elsereturn(0);
}

voidcleardis(void)
{
uchari;
for(i=0;i<16;i++)keystr[i]='';
lcd1602_Display(keystr,1);
}
ucharqux(uchara)
{
if(a==1)return(keystr[0]-0x30);
if(a==2)return((keystr[0]-0x30)*10+keystr[1]-0x30);
elsereturn(0);
}
ucharquy(uchara,b)
{
if(a==1)return(keystr[b]-0x30);
if(a==2)return((keystr[b]-0x30)*10+keystr[b+1]-0x30);
elsereturn(0);
}
main()
{
ucharnum=0,fu;
ucharx,y;
intresult;
lcd1602_Init();
lcd1602_Display(str,0);
while(1)
{
if(getkey())
{
if(keyval<10)keystr[num]=keyval+0x30;
else
{
if(keyval==10){num=255;fu=0;cleardis();}
if(keyval==11){
y=quy(num-fu-1,fu+1);
keystr[num]='=';
num++;
switch(keystr[fu])
{
case'/':result=x/y;break;
case'x':result=x*y;break;
case'-':result=x-y;break;
case'+':result=x+y;break;
default:break;
}
if(result<0)keystr[num]='-';
elsekeystr[num]='';
num++;
keystr[num]=result/1000+0x30;
num++;
keystr[num]=(result%1000)/100+0x30;
num++;
keystr[num]=(result%100)/10+0x30;
num++;
keystr[num]=result%10+0x30;
}
if(keyval==12){keystr[num]='/';fu=num;x=qux(fu);}
if(keyval==13){keystr[num]='x';fu=num;x=qux(fu);}
if(keyval==14){keystr[num]='-';fu=num;x=qux(fu);}
if(keyval==15){keystr[num]='+';fu=num;x=qux(fu);}
}
lcd1602_Display(keystr,1);
num++;
num%=16;
}

}
}

D. 单片机课程设计题目: 转速计的设计(LCD显示)

转速设计,我觉得显示用数码管就可以解决,用液晶显示就是浪费!你这个课题最难的应该是转速的精确度。
1、如果是步进电机
2、直流电机
3、交流电机
分这三种来进行深入的设计!最好把调速也作了,应该可以拿到A

E. 求单片机LCD1602简易计算器的设计

我有个可以实现整数的加减乘除,代码有点儿混乱,需要优化,不过总体结构还算清晰。需要的话给我留言留下你的邮箱

你不能拿了我的代码不给分啊,那也是我辛苦写出来的啊

F. 关于LCD数字显示温度计的课程设计,急,重赏

/*电子时钟源代码*/
#include<graphics.h>
#include<stdio.h>
#include<math.h>
#include<dos.h>
#define PI 3.1415926 /*定义常量*/
#define UP 0x4800 /*上移↑键:修改时间*/
#define DOWN 0x5000 /*下移↓键:修改时间*/
#define ESC 0x11b /*ESC键 : 退出系统*/
#define TAB 0xf09 /*TAB键 : 移动光标*/
/*函数声明*/
int keyhandle(int,int); /*键盘按键判断,并调用相关函数处理*/
int timeupchange(int); /*处理上移按键*/
int timedownchange(int); /*处理下移按键*/
int digithour(double); /*将double型的小时数转换成int型*/
int digitmin(double); /*将double型的分钟数转换成int型*/
int digitsec(double); /*将double型的秒钟数转换成int型*/
void digitclock(int,int,int ); /*在指定位置显示时钟或分钟或秒钟数*/
void drawcursor(int); /*绘制一个光标*/
void clearcursor(int);/*消除前一个光标*/
void clockhandle(); /*时钟处理*/

double h,m,s; /*全局变量:小时,分,秒*/
double x,x1,x2,y,y1,y2; /*全局变量:坐标值*/
struct time t[1];/*定义一个time结构类型的数组*/
main()
{
int driver, mode=0,i,j;
driver=DETECT; /*自动检测显示设备*/
initgraph(&driver, &mode, "");/*初始化图形系统*/
setlinestyle(0,0,3); /*设置当前画线宽度和类型:设置三点宽实线*/
setbkcolor(0);/*用调色板设置当前背景颜色*/
setcolor(9); /*设置当前画线颜色*/
line(82,430,558,430);
line(70,62,70,418);
line(82,50,558,50);
line(570,62,570,418);
line(70,62,570,62);
line(76,56,297,56);
line(340,56,564,56); /*画主体框架的边直线*/
/*arc(int x, int y, int stangle, int endangle, int radius)*/
arc(82,62,90,180,12);
arc(558,62,0,90,12);
setlinestyle(0,0,3);
arc(82,418,180,279,12);
setlinestyle(0,0,3);
arc(558,418,270,360,12); /*画主体框架的边角弧线*/
setcolor(15);
outtextxy(300,53,"CLOCK"); /*显示标题*/
setcolor(7);
rectangle(342,72,560,360); /*画一个矩形,作为时钟的框架*/

setwritemode(0); /*规定画线的方式。mode=0, 则表示画线时将所画位置的原来信息覆盖*/
setcolor(15);
outtextxy(433,75,"CLOCK");/*时钟的标题*/
setcolor(7);
line(392,310,510,310);
line(392,330,510,330);
arc(392,320,90,270,10);
arc(510,320,270,90,10); /*绘制电子动画时钟下的数字时钟的边框架*/
/*绘制数字时钟的时分秒的分隔符*/
setcolor(5);
for(i=431;i<=470;i+=39)
for(j=317;j<=324;j+=7){
setlinestyle(0,0,3);
circle(i,j,1); /*以(i, y)为圆心,1为半径画圆*/
}
setcolor(15);
line(424,315,424,325); /*在运行电子时钟前先画一个光标*/
/*绘制表示小时的圆点*/
for(i=0,m=0,h=0;i<=11;i++,h++){
x=100*sin((h*60+m)/360*PI)+451;
y=200-100*cos((h*60+m)/360*PI);
setlinestyle(0,0,3);
circle(x,y,1);
}
/*绘制表示分钟或秒钟的圆点*/
for(i=0,m=0;i<=59;m++,i++){
x=100*sin(m/30*PI)+451;
y=200-100*cos(m/30*PI);
setlinestyle(0,0,1);
circle(x,y,1);
}
/*在电子表的左边打印帮助提示信息*/
setcolor(4);
outtextxy(184,125,"HELP");
setcolor(15);
outtextxy(182,125,"HELP");
setcolor(5);
outtextxy(140,185,"TAB : Cursor move");
outtextxy(140,225,"UP : Time ++");
outtextxy(140,265,"DOWN: Time --");
outtextxy(140,305,"ESC : Quit system!");
outtextxy(140,345,"Version : 2.0");
setcolor(12);
outtextxy(150,400,"Nothing is more important than time!");
clockhandle();/*开始调用时钟处理程序*/
closegraph(); /*关闭图形系统*/
return 0; /*表示程序正常结束,向操作系统返回一个0值*/
}

void clockhandle()
{
int k=0,count;
setcolor(15);
gettime(t);/*取得系统时间,保存在time结构类型的数组变量中*/
h=t[0].ti_hour;
m=t[0].ti_min;
x=50*sin((h*60+m)/360*PI)+451; /*时针的x坐标值*/
y=200-50*cos((h*60+m)/360*PI); /*时针的y坐标值*/
line(451,200,x,y);/*在电子表中绘制时针*/

x1=80*sin(m/30*PI)+451; /*分针的x坐标值*/
y1=200-80*cos(m/30*PI); /*分针的y坐标值*/
line(451,200,x1,y1); /*在电子表中绘制分针*/

digitclock(408,318,digithour(h)); /*在数字时钟中,显示当前的小时值*/
digitclock(446,318,digitmin(m)); /*在数字时钟中,显示当前的分钟值*/
setwritemode(1);
/*规定画线的方式,如果mode=1,则表示画线时用现在特性的线
与所画之处原有的线进行异或(XOR)操作,实际上画出的线是原有线与现在规定
的线进行异或后的结果。因此, 当线的特性不变, 进行两次画线操作相当于没有
画线,即在当前位置处清除了原来的画线*/
for(count=2;k!=ESC;){ /*开始循环,直至用户按下ESC键结束循环*/
setcolor(12);/*淡红色*/
sound(500);/*以指定频率打开PC扬声器,这里频率为500Hz*/
delay(700);/*发一个频率为500Hz的音调,维持700毫秒*/
sound(200);/*以指定频率打开PC扬声器,这里频率为200Hz*/
delay(300);
/*以上两种不同频率的音调,可仿真钟表转动时的嘀哒声*/
nosound(); /*关闭PC扬声器*/
s=t[0].ti_sec;
m=t[0].ti_min;
h=t[0].ti_hour;

x2=98*sin(s/30*PI)+451; /*秒针的x坐标值*/
y2=200-98*cos(s/30*PI); /*秒针的y坐标值*/
line(451,200,x2,y2);
/*绘制秒针*/

/*利用此循环,延时一秒*/
while(t[0].ti_sec==s&&t[0].ti_min==m&&t[0].ti_hour==h)
{ gettime(t);/*取得系统时间*/
if(bioskey(1)!=0){
k=bioskey(0);
count=keyhandle(k,count);
if(count==5) count=1;
}
}
setcolor(15);
digitclock(485,318,digitsec(s)+1);/*数字时钟增加1秒*/

setcolor(12); /*淡红色*/
x2=98*sin(s/30*PI)+451;
y2=200-98*cos(s/30*PI);
line(451,200,x2,y2);
/*用原来的颜色在原来位置处再绘制秒针,以达到清除当前秒针的目的*/

/*分钟处理*/
if(t[0].ti_min!=m){ /*若分钟有变化*/
/*消除当前分针*/
setcolor(15); /*白色*/
x1=80*sin(m/30*PI)+451;
y1=200-80*cos(m/30*PI);
line(451,200,x1,y1);
/*绘制新的分针*/
m=t[0].ti_min;
digitclock(446,318,digitmin(m)); /*在数字时钟中显示新的分钟值*/
x1=80*sin(m/30*PI)+451;
y1=200-80*cos(m/30*PI);
line(451,200,x1,y1);
}

/*小时处理*/
if((t[0].ti_hour*60+t[0].ti_min)!=(h*60+m)){ /*若小时数有变化*/
/*消除当前时针*/
setcolor(15); /*白色*/
x=50*sin((h*60+m)/360*PI)+451;/*50:时钟的长度(单位:像素),451:圆心的x坐标值*/
y=200-50*cos((h*60+m)/360*PI);
line(451,200,x,y);
/*绘制新的时针*/
h=t[0].ti_hour;
digitclock(408,318,digithour(h));
x=50*sin((h*60+m)/360*PI)+451;
y=200-50*cos((h*60+m)/360*PI);
line(451,200,x,y);
}
}
}

int keyhandle(int key,int count) /*键盘控制 */
{ switch(key)
{case UP: timeupchange(count-1); /*因为count的初始值为2,所以此处减1*/<br> break;<br> case DOWN:timedownchange(count-1); /*因为count的初始值为2,所以此处减1*/<br> break;<br> case TAB:setcolor(15);<br> clearcursor(count); /*清除原来的光标*/<br> drawcursor(count); /*显示一个新的光标*/<br> count++;<br> break;<br> }
return count;
}

int timeupchange(int count) /*处理光标上移的按键*/
{
if(count==1){
t[0].ti_hour++;
if(t[0].ti_hour==24) t[0].ti_hour=0;
settime(t); /*设置新的系统时间*/
}

if(count==2){
t[0].ti_min++;
if(t[0].ti_min==60) t[0].ti_min=0;
settime(t); /*设置新的系统时间*/
}

if(count==3){
t[0].ti_sec++;
if(t[0].ti_sec==60) t[0].ti_sec=0;
settime(t); /*设置新的系统时间*/
}
}

int timedownchange(int count) /*处理光标下移的按键*/
{
if(count==1) {
t[0].ti_hour--;
if(t[0].ti_hour==0) t[0].ti_hour=23;
settime(t);/*设置新的系统时间*/
}
if(count==2) {
t[0].ti_min--;
if(t[0].ti_min==0) t[0].ti_min=59;
settime(t);/*设置新的系统时间*/
}

if(count==3) {
t[0].ti_sec--;
if(t[0].ti_sec==0) t[0].ti_sec=59;
settime(t);/*设置新的系统时间*/
}
}

int digithour(double h)/*将double型的小时数转换成int型*/
{int i;<br>for(i=0;i<=23;i++)<br> {if(h==i) return i;}
}

int digitmin(double m)/*将double型的分钟数转换成int型*/
{int i;<br>for(i=0;i<=59;i++)<br> {if(m==i) return i;}
}

int digitsec(double s) /*将double型的秒钟数转换成int型*/
{int i;<br>for(i=0;i<=59;i++)<br> {if(s==i) return i;}
}

void digitclock(int x,int y,int clock)/*在指定位置显示数字时钟:时\分\秒*/
{char buffer1[10];<br>setfillstyle(0,2);<br>bar(x,y,x+15,328);<br>if(clock==60) clock=0;<br>sprintf(buffer1,"%d",clock);<br>outtextxy(x,y,buffer1);<br>}

void drawcursor(int count) /*根据count的值,画一个光标*/
{switch(count)<br>{<br> case 1:line(424,315,424,325);break;<br> case 2:line(465,315,465,325);break;<br> case 3:line(505,315,505,325);break;<br> }
}

void clearcursor(int count) /*根据count的值,清除前一个光标*/
{switch(count)<br>{<br> case 2:line(424,315,424,325);break;<br> case 3:line(465,315,465,325);break;<br> case 1:line(505,315,505,325);break;<br> }
}

G. 帮忙写简单计算器课程设计书

简介下的
要求是什么

H. 单片机设计简单计算器在lcd1602显示c语言编程

可以看看《吴鉴鹰单片机项目实战精讲》,这个里面有详细的介绍。

I. 求一份单片机计算器的设计课程设计一份

网上能搜到的,我同学做毕业设计就网上找的

热点内容
武汉大学学生会辅导员寄语 发布:2021-03-16 21:44:16 浏览:612
七年级学生作文辅导学案 发布:2021-03-16 21:42:09 浏览:1
不屑弟高考成绩 发布:2021-03-16 21:40:59 浏览:754
大学毕业证会有成绩单 发布:2021-03-16 21:40:07 浏览:756
2017信阳学院辅导员招聘名单 发布:2021-03-16 21:40:02 浏览:800
查询重庆2018中考成绩查询 发布:2021-03-16 21:39:58 浏览:21
结业考试成绩怎么查询 发布:2021-03-16 21:28:40 浏览:679
14中医医师资格笔试考试成绩查分 发布:2021-03-16 21:28:39 浏览:655
名著赏析课程标准 发布:2021-03-16 21:27:57 浏览:881
北京大学商业领袖高端培训课程 发布:2021-03-16 21:27:41 浏览:919