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

📄 main.c

📁 使用凌阳单片机制作的一个数字电压表,直接采用凌阳自带的AD转换,通过LCD显示转换结果.
💻 C
字号:
#include "SPCE061A.h"             //IOA0口是电压测试端,ADC的输入电压范围为0-3.3V
#define lcd1602_rs_high  0x0100/*定义lcd端口*/
#define lcd1602_rs_low  0xfeff/**/
#define lcd1602_rw_high 0x0200
#define lcd1602_rw_low 0xfdff
#define lcd1602_e_high 0x0400
#define lcd1602_e_low 0xfbff
unsigned  char string[]="Lingyang College";/*定义显示界面*/
unsigned char string1[]="Voltage= .  V";
unsigned int i;
float voltage=0.0;
unsigned int zhengshu,zs,xs1,xs2;
void main(void)
{
	initial_lcd1602();/*初始化液晶*/
	write_lcd1602_string(0x0080,string);/*显示ShaoGuan College*/
	write_lcd1602_string(0x00c0,string1);
	*P_ADC_MUX_Ctrl=C_ADC_CH1;/* 选择AD的line 1*/
	*P_ADC_Ctrl=0x0001;/*设定控制寄存器*/
	while (1)
	{
		*P_Watchdog_Clear=0x0001;
		i=ad();/*调用子程序  */
		voltage=(float)i*3.3/0x03ff;/*将数字量转换成电压,3.3564V*/
		      //(float)i:强制把i转化成浮点型;
		zhengshu=(int)( voltage*100);/*提取整数和小数的2位*/
		zs=zhengshu/100;/*得出电压的整数部分*/
		xs1=(zhengshu%100)/10;/*得出电压的小数的第一位*/
		xs2=(zhengshu%100)%10;/*得出电压的小数的第二位*/
		write_lcd1602_instruction(0x00c8);/*定位,在第二行的第8位显示整数*/
		write_lcd1602_data(zs+0x0030);
		write_lcd1602_instruction(0x00ca);	/*定位,在第二行的第10位显示小数*/
		write_lcd1602_data(xs1+48);   //48=ASCII(V)
		write_lcd1602_data(xs2+48);	
	}
}
unsigned int ad(void)
{
	unsigned int j;
	while(!(*P_ADC_MUX_Ctrl&0x8000));/*等待AD转换结束*/
	j=*P_ADC_LINEIN_Data;/*读AD转换的数据*/
	//P_ADC_LINEIN_Data的作用等效于P_ADC_MUX_Data,
	j=j>>6;/*转换存储格式,变成B9-B0存储数据*/
	return(j&0x03ff);
}
void checkbusy_lcd1602(void)
{
	*P_IOB_Dir=0xff7f;
	*P_IOB_Attrib=0xffff;
	*P_IOB_Data=0xffff;
	*P_IOB_Buffer=*P_IOB_Buffer|0x00ff;
    *P_IOB_Buffer=*P_IOB_Buffer&lcd1602_rs_low;
	*P_IOB_Buffer=*P_IOB_Buffer&lcd1602_e_low;
	*P_IOB_Buffer=*P_IOB_Buffer|lcd1602_rw_high;
     *P_IOB_Buffer=*P_IOB_Buffer|lcd1602_e_high;	
	 delay(10);	    		
	 while(*P_IOB_Data&0x0080)
	   {
	   	*P_Watchdog_Clear=0x0001;	   	
	   }
	*P_IOB_Buffer=*P_IOB_Buffer&lcd1602_e_low;
	*P_IOB_Dir=0xffff;	
}
void write_lcd1602_instruction(unsigned int i)
{
	checkbusy_lcd1602();
	*P_Watchdog_Clear=0x0001;
	*P_IOB_Buffer=*P_IOB_Buffer&lcd1602_e_low;
	*P_IOB_Buffer=*P_IOB_Buffer&lcd1602_rw_low;
	*P_IOB_Buffer=*P_IOB_Buffer&lcd1602_rs_low;
    *P_IOB_Buffer=*P_IOB_Buffer|lcd1602_e_high;	
    *P_IOB_Buffer=(*P_IOB_Buffer&0xff00)|i;
   	*P_IOB_Buffer=*P_IOB_Buffer&lcd1602_e_low;
}
void write_lcd1602_data(unsigned int i)
{
	checkbusy_lcd1602();
	*P_Watchdog_Clear=0x0001;
	*P_IOB_Buffer=*P_IOB_Buffer&lcd1602_e_low;
	*P_IOB_Buffer=*P_IOB_Buffer&lcd1602_rw_low;
	*P_IOB_Buffer=*P_IOB_Buffer|lcd1602_rs_high;
	 *P_IOB_Buffer=*P_IOB_Buffer|lcd1602_e_high;
	*P_IOB_Buffer=(*P_IOB_Buffer&0xff00)|i;
	*P_IOB_Buffer=*P_IOB_Buffer&lcd1602_e_low;
}



void write_lcd1602_string(unsigned int x,unsigned *p)
{
	
	write_lcd1602_instruction(x);
	while(*p!=0x0000)
	{
		*P_Watchdog_Clear=0x0001;
		write_lcd1602_data(*p);
		p++;
		if(x++==0x008f)
		{
			write_lcd1602_instruction(0x00c0);
		}
	}
}

void cls(void)
{
	write_lcd1602_instruction(0x0001);
}
void initial_lcd1602(void)
{
	write_lcd1602_instruction(0x0038);
	delay(100);
	write_lcd1602_instruction(0x000c);
	delay(100);
	write_lcd1602_instruction(0x0006);
	write_lcd1602_instruction(0x0001);
		
}
void delay(unsigned int i)
{
	*P_Watchdog_Clear=0x0001;
	while(i--!=0x0000);
}

⌨️ 快捷键说明

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