久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
如何將單片機程序里的lcd改成數碼管?求思路
[打印本頁]
作者:
bk0001
時間:
2019-6-20 08:57
標題:
如何將單片機程序里的lcd改成數碼管?求思路
rlc測量電容電感電阻,麻煩大神把里面的lcd程序改成數碼管程序。謝謝了!
單片機源程序如下:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define C1 0.045
uchar code title1[]="歡迎使用 ";
uchar code title2[]="LRC 萬用表 ";
uchar code code_L[]="電感: ";
uchar code code_R[]="電阻: ";
uchar code code_C[]="電容: ";
uchar code code_e[]="錯誤: ";
uchar num;
sbit key1 =P1^0;
sbit key2 =P1^1;
sbit key3 =P1^2;
float LZ=0;
float RX=0;
float CX=0;
float f=0;
float temp_f[4];
unsigned int tt,th1,tl1;
unsigned int pluse=0;
bit flag=0;
unsigned char key_num=0;
#define L 1
#define R 2
#define C 3
sbit aa1 =P2^0;
sbit bb1 =P2^1;
#include<Lcd12864.h>
void cd4051(unsigned char num)
{
switch(num)
{
case 1: bb1=0;aa1=0;break;
case 2: bb1=0;aa1=1; break;
case 3: bb1=1;aa1=0; break;
default : aa1=1;aa1=1;break;
}
}
void scan_key()
{
if(!key1){
if(!key1){
while(!key1);
key_num=1;
cd4051(L);
Lcd_ShowSring(4,0,code_L);
Lcd_ShowSring(1,15,"L");
}
}
if(!key2){
if(!key2){
while(!key2);
key_num=2;
cd4051(R);
Lcd_ShowSring(4,0,code_R);
Lcd_ShowSring(1,15,"R");
}
}
if(!key3){
if(!key3){
while(!key3);
key_num=3;
cd4051(C);
Lcd_ShowSring(4,0,code_C);
Lcd_ShowSring(1,15,"C");
}
}
}
void init() //中斷初始化
{
//定時器0和定時器1都是方式1,16位定時器
//定時器設置
TMOD=0x51; //設置定時器0,方式1:16位定時器
TH1=0x00; //定時器1高位裝初值
TL1=0x00; //定時器1低位裝初值
ET1=1; //定時器1 使能位
TH0=(65535-50000)/255; //定時器1高位裝初值
TL0=(65535-50000)%255;; //定時器1高位裝初值
ET0=1; ////定時器0 使能位
TR0=1;
TR1=1;
EA=1;// 總中斷
}
void Measurement_L();//電感測量
void Measurement_R();//電阻測量
void Measurement_C();//電容測量
unsigned char gather_num=0;
unsigned char m_second=0;
void main ()
{
LCDInit();
Lcd_ShowSring(1,0,title1);
Lcd_ShowSring(2,0,title2);
init();
while(1){
scan_key();
if(flag){
flag=0;
//在十ms里面記了這么多個脈沖
// 那么一個脈沖的周期就是 50ms/tt /1000 (s) 化簡得到 f 20tt
if(gather_num<4) {
temp_f[gather_num]=pluse*65536+256*TH1+TL1;
gather_num++;
}
else{
gather_num=0;
f=(temp_f[0]+temp_f[1]+temp_f[2]+temp_f[3])/4.0;
switch(key_num) {
case 1:Measurement_L(); break;
case 2:Measurement_R(); break;
case 3:Measurement_C(); break;
default :break;
}
}
TH0=(65535-50000)/255; //定時器1高位裝初值
TL0=(65535-50000)%255;; //定時器1高位裝初值
TH1=0; //清零開始重新計數
TL1=0;
pluse=0;
TR0=1;//開定時器計時10ms;//使能位外部中斷0 數10內有多少個脈沖
TR1=1;//進行新一輪的計數
m_second=0;
}
}
}
void time0()interrupt 1 //定時器0 服務
{
TH0=60; //定時器1高位裝初值
TL0=235;; //定時器1高位裝初值
m_second++;
if(m_second==20){
TR1=0;//關掉定時器1
TR0=0; // 關掉定時器0
m_second=0;
flag=1;
}
}
void time1()interrupt 3 //定時器1 服務
{
pluse++;
TH1=0;
TL1=0;
}
void Measurement_L()
{
if(f==0){
LZ=0;
Lcd_ShowSring(4,0,code_L);
}
else {
LZ=5.63466627*10e10/f/f;
LZ=LZ/1.0727272727272727272727272727273;
Lcd_ShowSring(4,0,"電感:");
Lcd_Display_u(4,4,LZ);
}
if(LZ>99999999) {
}
}
void Measurement_R()//電阻測量
{
if(f==0){
RX=0;
}
else if( 0< f&& f<30) { //1M 7
RX= 14400000.0/f;
RX= RX-3000;
RX =RX/2/0.95; //修正
}
else if(f <700) { //10k 650
RX= 14400000.0/f;
RX= RX-3000;
RX =RX/2/0.95; //修正
}
else if(f <1500) { //4.7k 1209
RX= 14400000.0/f;
RX= RX-3000;
RX =RX/2/0.94; //修正
}
else if(f <3000) { //1k 2983
RX= 14400000.0/f;
RX= RX-3000;
RX =RX/2/0.91; //修正
//0.91286863270777479892761394101877
}
else if(f <4500) {
RX= 14400000.0/f;
RX= RX-3000;
RX =RX/2/0.74; //修正
}
else if(f <5000) {
RX= 14400000.0/f;
RX= RX-3000;
//修正 100
RX =RX/2/0.50; //修正
}
if(RX==0){
Lcd_ShowSring(4,0,code_R);
} else{
Lcd_ShowSring(4,0,"電阻:");
Value_to_ASCII1(4,3, RX);
}
if(RX>99999999) {
// Lcd_ShowSring(4,0,code_e);
}
}
void Measurement_C()//C測量
{
if(f==0){
CX=0;
Lcd_ShowSring(4,0,code_C);
}
else if(f>5000){
CX=0;
Lcd_ShowSring(4,0,code_C);
}
else {
CX=481000.0/f/1.0276595744680851063829787234043;//修正
Lcd_ShowSring(4,0,"電容:");
Value_to_ASCIIC(4,3,CX);
}
if(CX>99999999) {
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////********************************************
Description: LCD12864 驅動 ,采用串行方式,
********************************************/
//******12864**************
sbit lcd_RS = P0^2;
sbit Lcd_Rw = P0^1;
sbit Lcd_En = P0^0;
#define BIT(n) (1<<(n))
#define SID_0 Lcd_Rw=0;
#define SID_1 Lcd_Rw=1;
#define SCLK_0 Lcd_En=0;
#define SCLK_1 Lcd_En=1;
//15腳 PSB 接低電平
//函數 delay(uchar z)
//功能能 延時
void Delay(uchar z)
{
uchar a,b;
for(a=z;a>0;a--)
for(b=200;b>0;b--);
}
void SendByte(uchar bye)
{
uchar i;
for(i=0;i<8;i++)
{
if((bye<<i)&0x80){SID_1;}
else {SID_0;}
SCLK_1;
SCLK_0;
}
}
void Lcd_WriteCom(uchar CMD)
{
SendByte(0xf8);
SendByte(CMD&0xf0);
SendByte((CMD<<4)&0xf0);
}
void Lcd_WriteDate(uchar Data)
{ SendByte(0xf8+2);
SendByte(Data&0xf0);
SendByte((Data<<4)&0xf0);
}
void LCDInit()
{/* RST=0;
delay1MS(50);
RST=1; */
lcd_RS=1;
Lcd_WriteCom(0x34);//功能設置,一次送8位數據,基本指令集
Lcd_WriteCom(0x30);//0000,1100 整體顯示,游標off,游標位置off
Lcd_WriteCom(0x01);//0000,0001 清DDRAM
Lcd_WriteCom(0x06);//0000,0010 DDRAM地址歸位
Lcd_WriteCom(0x0c);//1000,0000 設定DDRAM 7位地址000,0000到地址計數器AC//
}
/*****************************
發送字符串
*****************************/
//void show_str(uchar const *s)//改AVR去掉const
void Lcd_String(const uchar *str)
{ while(*str !='\0')
{
Lcd_WriteDate(*str++);
}
}
////////////////////////////////////////////////////////////////////
//函數 Lcd_init(uchar com)
//功能 精確屏幕顯示數據
//參數 line 液晶屏的第幾行 list 第幾個位置開始寫 (最多8個列) Date要寫的數據
void Lcd_Display(uchar line,uchar list,uint Date)
{
uchar i;
uchar ta[]={0,0,0,0,0,'\0'}; //用一個數組來裝數
list=list &0x07; //限制在 0-7列
switch(line){
case 1: Lcd_WriteCom(0x80+list);break; //第一行
case 2: Lcd_WriteCom(0x90+list);break; //第二行
case 3: Lcd_WriteCom(0x88+list);break; //第三行
case 4: Lcd_WriteCom(0x98+list);break; //第四行
default : break;
}
for(i=5;i>0;i--)
{ //循環四次把四個數從高到低裝入ta
ta[i-1]=Date%10+48;
Date=Date/10;
}
Lcd_String(ta);
}
////////////////////////////////////////////////////////////////////
//函數 Lcd_init(uchar com)
//功能 精確屏幕顯示數據
//參數 line 液晶屏的第幾行 list 第幾個位置開始寫 (最多8個列) Date要寫的數據
void Lcd_Display_u(uchar line,uchar list,unsigned long Date)
{
uchar i;
uchar ta[]={0,0,0,0,0,'\0'}; //用一個數組來裝數
list=list &0x07; //限制在 0-7列
switch(line){
case 1: // Lcd_WriteCom(0x80+list);Lcd_String(" ");
Lcd_WriteCom(0x80+list);break; //第一行
case 2: // Lcd_WriteCom(0x90+list);Lcd_String(" ");
Lcd_WriteCom(0x90+list);break; //第二行
case 3: // Lcd_WriteCom(0x88+list);Lcd_String(" ");
Lcd_WriteCom(0x88+list);break; //第三行
case 4: //Lcd_WriteCom(0x98+list);Lcd_String(" ");
Lcd_WriteCom(0x98+list);break; //第四行
default : break;
}
for(i=5;i>0;i--)
{ //循環四次把四個數從高到低裝入ta
ta[i-1]=Date%10+48;
Date=Date/10;
}
//循環四次把四個數從高到低裝入ta
if(ta[0]!=48){
Lcd_WriteDate(ta[0]);
Lcd_WriteDate(ta[1]);
Lcd_WriteDate(ta[2]);
Lcd_WriteDate(ta[3]);
Lcd_WriteDate(ta[4]);
Lcd_WriteDate('u');
Lcd_WriteDate('H');
}
else{
if(ta[1]!=48){
Lcd_WriteDate(ta[1]);
Lcd_WriteDate(ta[2]);
Lcd_WriteDate(ta[3]);
Lcd_WriteDate(ta[4]);
Lcd_WriteDate('u');
Lcd_WriteDate('H');
Lcd_WriteDate(' ');
}
else{
if(ta[2]!=48){
Lcd_WriteDate(ta[2]);
Lcd_WriteDate(ta[3]);
Lcd_WriteDate(ta[4]);
Lcd_WriteDate('u');
Lcd_WriteDate('H');
Lcd_WriteDate(' ');
Lcd_WriteDate(' ');
}
else{
if(ta[3]!=48){
Lcd_WriteDate(ta[3]);
Lcd_WriteDate(ta[4]);
Lcd_WriteDate('u');
Lcd_WriteDate('H');
Lcd_WriteDate(' ');
Lcd_WriteDate(' ');
Lcd_WriteDate(' ');
}
else{
Lcd_WriteDate(ta[4]);
Lcd_WriteDate('u');
Lcd_WriteDate('H');
Lcd_WriteDate(' ');
Lcd_WriteDate(' ');
Lcd_WriteDate(' ');
Lcd_WriteDate(' ');
}
}
}
}
}
////////////////////////////////////////////////////////////////////
//函數 Lcd_init(uchar com)
//功能 精確屏幕顯示字符串
//參數 line 液晶屏的第幾行 list 第幾個位置開始寫 (最多8個列) *p要寫的字符串
void Lcd_ShowSring(uchar line,uchar list,uchar*p)
{
switch(line){
case 1: Lcd_WriteCom(0x80+list);break; //第一行
case 2: Lcd_WriteCom(0x90+list);break; //第二行
case 3: Lcd_WriteCom(0x88+list);break; //第三行
case 4: Lcd_WriteCom(0x98+list);break; //第四行
default : break;
}
Lcd_String(p);
}
void Value_to_ASCII1(uchar line,uchar list,unsigned long value) //歐姆級
{
unsigned char temp[] = "00000000歐";
temp[0] = value/10000000%10 + 0x30;
temp[1] = value/1000000%10 + 0x30;
temp[2] = value/100000%10 + 0x30;
temp[3] = value/10000%10 + 0x30;
temp[4] = value/1000%10 + 0x30;
temp[5] = value/100%10 + 0x30;
temp[6] = value/10%10 + 0x30;
temp[7] = value%10 + 0x30;
if(temp[0]==0x30) {
temp[0]=' ';
if(temp[1]==0x30) {
temp[1]=' ';
if(temp[2]==0x30) {
temp[2]=' ';
if(temp[3]==0x30) {
temp[3]=' ';
if(temp[4]==0x30) {
temp[4]=' ';
if(temp[5]==0x30) {
temp[5]=' ';
if(temp[6]==0x30) {
temp[6]=' ';
}
}
}
}
}
}
}
Lcd_ShowSring( line,list,temp) ;
}
void Value_to_ASCIIC(uchar line,uchar list,unsigned long value)
{
unsigned char temp[] = "00000000nF";
temp[0] = value/10000000%10 + 0x30;
temp[1] = value/1000000%10 + 0x30;
temp[2] = value/100000%10 + 0x30;
temp[3] = value/10000%10 + 0x30;
temp[4] = value/1000%10 + 0x30;
temp[5] = value/100%10 + 0x30;
temp[6] = value/10%10 + 0x30;
temp[7] = value%10 + 0x30;
if(temp[0]==0x30) {
temp[0]=' ';
if(temp[1]==0x30) {
temp[1]=' ';
if(temp[2]==0x30) {
temp[2]=' ';
if(temp[3]==0x30) {
temp[3]=' ';
if(temp[4]==0x30) {
temp[4]=' ';
if(temp[5]==0x30) {
temp[5]=' ';
if(temp[6]==0x30) {
temp[6]=' ';
}
}
}
}
}
}
}
Lcd_ShowSring( line, list,temp) ;
}
復制代碼
所有資料51hei提供下載:
C程序.doc
(63 KB, 下載次數: 7)
2019-6-20 08:55 上傳
點擊文件名下載附件
作者:
yzwzfyz
時間:
2019-6-20 17:32
哪里會編程也,只會抄程序,數據往LCD上送,抄一段程序,OK了。
現在數據要送到LED上,傻眼了。
先畫出硬件LED驅動圖,再依圖中LED的段位連接做譯碼,做好這兩點你就能完成本題了。
作者:
abcv
時間:
2019-6-20 18:50
看下LED有沒有驅動芯片控制,有的就通過芯片控制,沒有直接控制,控制之前看下共陽或者共陰極,即可。
作者:
cjm82
時間:
2019-6-21 16:16
頂沙發,直接用別人的代碼,不是不行,而且是最好的辦法,關鍵得仔細看看,起碼別人辛苦寫的注釋得認真看看吧,得知道某一塊是起什么作用的. 多琢磨別人的代碼,也可以試著修改別人的代碼,觀察修改后的運行結果等等,只有這樣,自己的水平才能提高.
你這個要改用LED顯示,那么跟LCD驅動之類的東西都可以不要了,自己參考Value_to_ASCII1這個函數,改寫下,讓他符合LED顯示就行了.這個難度很低,應該初學單片機一兩周就會了,具體怎么實現如果不是很清楚還是返回去看看書,琢磨一下吧.
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
精品久久电影
|
在线免费观看黄色av
|
逼逼视频
|
国产精品久久久久久吹潮日韩动画
|
精品一区二区三区视频在线观看
|
青青草综合
|
午夜在线小视频
|
国产精品美女久久久久久久网站
|
亚洲a视频
|
久久网国产
|
av免费网站在线
|
色在线免费视频
|
涩涩视频网
|
av中文在线
|
www.黄色片视频
|
福利视频网站
|
久久大陆
|
久久久新视频
|
久久久久久亚洲
|
亚洲影音
|
国产一区二区日韩
|
国产精品久久久久久久久久免费
|
免费在线观看91
|
国产精品久久久久久久久久久新郎
|
亚洲欧美一区二区三区在线
|
美日韩免费视频
|
精品福利在线
|
亚洲精品久久区二区三区蜜桃臀
|
久久久久久美女
|
欧美精品福利
|
99re在线视频
|
欧美性乱
|
午夜精品三区
|
综合色播
|
欧美一级毛片免费观看
|
国产成人aⅴ
|
成人h动漫亚洲一区二区
|
日韩中文字幕第一页
|
日韩在线高清
|
亚洲精品一区二区三区蜜桃久
|
日本免费一区二区三区
|