⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 数字电压表头.c

📁 用AD转换做的数字电压表头
💻 C
字号:
// 数字电压表头程序,满程2.5V
#include <iom8V.h>
#include <macros.h>
#define uchar unsigned char
#define uint  unsigned int
#define SET_E       PORTC|=0x04       // LCD: E = 1
#define CLR_E       PORTC&=~0x04      // LCD: E = 0
#define CLR_RW      PORTC&=~0x02      // LCD: R/W = 0 
#define SET_RS      PORTC|=0x01       // LCD: R/S = 1 
#define CLR_RS      PORTC&=~0x01      // LCD: R/S = 0 
#define LCD_Data    PORTB             // 数据端口PB口

uchar Table[]="0123456789";//显示字符表
uchar Data[]={0,0,0,0};    //显示初始值

//延时函数
void DelayMs(uint i)       //Ms级延时,参数i为延时时间
{uint j;
 for(;i!=0;i--)
  {for(j=1142;j!=0;j--) ;}
}

//LCD写数据函数
void WriteData(uchar D)
{
 SET_RS; 
 LCD_Data=D;
 CLR_RW;
 CLR_E; 
 DelayMs(2);
 SET_E;
}

//LCD写指令函数
void WriteCommand(uchar C) 
{
 CLR_RS;
 LCD_Data=C;
 CLR_RW;
 CLR_E; 
 DelayMs(2);
 SET_E;
}

//显示函数,x表示待显示字符的列,y表示行
void Display(uchar x, uchar y, uchar *p)
{uchar i,j;
 for(i=x;i<x+4;i++)
 {
 if (y==0)
  { 
  j=0x80+i;        //当要显示第一行时地址码+0x80;
  WriteCommand(j); //发送地址码
  j=i-x;
  WriteData(Table[p[j]]); //查表、显示字符
  }
 else 
  {
  j=0xc0+i;        //当要显示第二行时地址码+0xc0;
  WriteCommand(j); //发送地址码
  j=i-x;
  WriteData(Table[p[j]]); //显示字符
  }
 }
}

//计数值处理函数,将计数值拆分为BCD码,用于查表显示
void Process(uint i,uchar *p)
{p[0]=i/1000;
 i=i%1000;
 p[1]=i/100;
 i=i%100;
 p[2]=i/10;
 i=i%10;
 p[3]=i;
}

//ADC转换函数
uint ADC_Convert(void)
{uint temp1,temp2;
 temp1=ADCL;
 temp2=ADCH;
 temp2=(temp2<<8)+temp1;
 return temp2;
}

//初始化函数
void Init(void) 
{
 DDRB=0xff;                    //设置B口为推挽1输出;
 PORTB=0xff;
 DDRC=0x07;                    //设置PC0-2为推挽1输出,PC3-7为无上拉电阻输入
 PORTC=0x07;
 ADMUX=0xc3;                   //使用内部2.56V电压源,选择通道ADC3
 ADCSRA=0xe6;                  //125K转换速率,自由转换模式,启动AD转换器
 LCD_Data=0;
 WriteCommand(0x38);
 //DelayMs(5); 
 WriteCommand(0x38); //显示模式设置
 WriteCommand(0x08); //关闭显示
 WriteCommand(0x01); //显示清屏
 WriteCommand(0x06); // 显示光标移动设置
 WriteCommand(0x0c); // 显示开及光标设置
}

//主函数
void main(void)
{uint i;
 DelayMs(500);
 Init();                   //初始化I/O口
 DelayMs(500);             //延时待系统稳定;
 while(1)
 {
  i=ADC_Convert();         //ADC转换
  i=i*5/2;                 //数据处理
  Process(i,Data);         //将计数值转换为BCD码
  Display(0,0,Data);       //显示数据  
 }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -