pic单片机c语言入门(PIC单片机C语言)

本文目录
- PIC单片机C语言
- pic单片机的中断处理函数是怎么回事,c语言代码怎么写
- pic单片机编程,c语言在头文件里有些语句不明白,麻烦解释下 特别是这个:符号
- PIC单片机C语言编程的高手来帮帮忙啊!
- pic 单片机eeprom定义的c语言描述
- PIC单片机输出PWM波的C语言源程序
- 关于PIC单片机C语言编程
- 在pic中如何用C语言编写程序
- 有几行PIC单片机的c语言程序代码看不懂,请教一下
PIC单片机C语言
这是个宏定义,他的作用就是用AN0替代CHS2=0;CHS1=0;CHS0=0;
在程序中,当你要用到CHS2=0;CHS1=0;CHS0=0;时,只需要写上AN0就行了。
程序编译时,编译器会自动把AN0再换成CHS2=0;CHS1=0;CHS0=0;进行编译。
有问题请追问。
pic单片机的中断处理函数是怎么回事,c语言代码怎么写
首先,在初始化中设置好I/O口功能。开中断,初始化串口。
然后写个串口中断函数,例如:
void interrupt isr(void)
if(RCIE&&RCIF) //串口接收中断
{
while(!RCIF);
NOP();NOP();NOP();
recive_dat=RCREG; //接收1位数据
NOP();NOP();NOP();
CREN=0;
NOP();NOP();NOP();
CREN=1;
}
当然,你把括号中加上你的函数就好了。
本人建议不要在中断中处理函数,最好在中断中返回个标志位,然后在主函数中执行函数。
如果一定要在中断中执行函数,这个函数最好在其他地方不使用,否则容易出错哦。
你说的RXIF我不知道,我只知道RCIF。
pic单片机编程,c语言在头文件里有些语句不明白,麻烦解释下 特别是这个:符号
首先,其中第一个"extern"为外部变量声明,即这些变量不是你程序中定义的,是在这些头文件里定义的,第二个"union"是联合体的意思,这个和标准C中的联合体是一样的,第三个"struct"指的是结构体,再下来,为结构体保留一位(最低位开始!),再下来为结构体定义一个位,命名为""TCS",接着再为结构体定义命名位“TSYNC”,然后再保留一位。
最好你能把完整的这个定义发来看,不能只露出一个脚让我猜这只鸟是什么鸟。
PIC单片机C语言编程的高手来帮帮忙啊!
你好,对于你这个问题其实也不是太难,不要在乎片子有多复杂,也不要在乎问题有多难,关键是勇于挑战他,你弄永远不行,程序是调试出来的,别人给你写的你不一定可以用得上。AD985X系列的DDS芯片大同小异,基本也就是协议问题。仔细看一下,手册上的介绍对你很有帮助,还有就是关于你选择的PIC的那款片子,也很简单,给你一个相关的程序参考一下,真的是大同小异无非是细节问题。这个没有人能帮到你,靠自己是最好的也可以学习很多东西。还是那句话程序师调试出来的
如果在调试过程中有什么问题请Hi我,常在线
AD9851的驱动程序
//头文件
#include "SPCE061A.h"
//变量说明
unsigned long int Freq_Ctrl_Word = 0x051eb851; //频率控制字 先传低位再传高位
unsigned int Phase_Ctrl_Word = 0x0000; //相位控制字 先传低位再传高位
unsigned int Order_Ctrl_Word = 0x0000;//b32:0 6倍频关闭 b33b34:00 电源工作模式
//定义AD9851与SPCE061A的接口
#define M_DATA 0x0001
#define M_UD 0x0002
#define M_CLK 0x0004
#define Set_IOA_Bit(x) (*P_IOA_Data = *P_IOA_Buffer | x) //置高
#define Clear_IOA_Bit(x) (*P_IOA_Data = *P_IOA_Buffer & ~x) //置低
//====================================================================
// ----Function: void Init_AD9851(void)
// -Description: 初始化与AD9851连接的IO口
// --Parameters: 无
// ------Return: 无
// -------Notes: 不影响其他IO口
//====================================================================
void Init_AD9851(void)
{
*P_IOA_Dir |= (M_DATA + M_UD + M_CLK);
*P_IOA_Attrib |= (M_DATA + M_UD + M_CLK);
*P_IOA_Data &= ~(M_DATA + M_UD + M_CLK);
}
//====================================================================
// ----Function: void Write_AD9851(void)
// -Description: 向AD9851写入频率控制字,命令控制字和相位控制字
// --Parameters: 无
// ------Return: 无
// -------Notes: 无
//====================================================================
void Write_AD9851(void)
{
unsigned long int mask = 0x0001;
unsigned int i;
Clear_IOA_Bit(M_UD); //M_UD置低
//送32位频率控制字
for(i = 0;i 《 32;i++)
{
Clear_IOA_Bit(M_CLK); //M_CLK置低
if(Freq_Ctrl_Word & mask)
{
Set_IOA_Bit(M_DATA);
}
else
{
Clear_IOA_Bit(M_DATA);
}
Set_IOA_Bit(M_CLK);
mask = mask 《《 1;
}
//送3位的命令控制字
mask = 0x0001;
for(i = 0;i 《 3;i++)
{
Clear_IOA_Bit(M_CLK); //M_CLK置低
if(Order_Ctrl_Word & mask)
{
Set_IOA_Bit(M_DATA);
}
else
{
Clear_IOA_Bit(M_DATA);
}
Set_IOA_Bit(M_CLK);
mask = mask 《《 1;
}
//送5位相位控制字
mask = 0x0001;
for(i = 0;i 《 5;i++)
{
Clear_IOA_Bit(M_CLK); //M_CLK置低
if(Phase_Ctrl_Word & mask)
{
Set_IOA_Bit(M_DATA);
}
else
{
Clear_IOA_Bit(M_DATA);
}
Set_IOA_Bit(M_CLK);
mask = mask 《《 1;
}
Set_IOA_Bit(M_UD); //M_UD置高 ,产生上升沿 ,频率更新使能,输出有效
}
最后在说一下个人的理解,也就是DDS与MCU之间的接口问题,个人认为有点像SPI,只不过SPI的数据口是串行的,而在这这里是分时并行。主要问题就是协议,唯一的办法就是求助于数据手册,我刚出去查了一下,好像全是E文的,建议前期工作就是对照Google翻译这个数据手册,很有必要。
学习和创作的过程也很有趣,虽然很艰辛
pic 单片机eeprom定义的c语言描述
预处理控制行又称预处理命令,是C编译系统的一个组成部分。C语言提供的预处理功能主要有以下三种: (1) 宏定义; (2) 文件包含; (3) 条件编译。 它们分别用宏定义命令、文件包含命令和条件编译命令来实现。为了与一般C语句相区别,这些命令以符号"#"开头,并且在其行的末尾不用分号。详见C编译器手册或较详细的C语言程序设计教材。 8. 问:EEPROM、FLASH和其它存储器有何不同? 答:最初的存储器有随机存取的(RAM)和只读的(ROM),现每一种都有亚型,甚至有混合型的第三类存储器。RAM系列中有静态的(SRAM)和动态的(DRAM)。ROM从掩膜ROM演化到PROM(可编程的ROM)和EPROM(可擦写可编程ROM)。混合型的存储器有EEPROM、FLASH和NVRAM。EEPROM和FLASH存储器是ROM的子代,而NVRAM是SRAM的改版。 EEPROM是电可擦除的、可编程的ROM。FLASH存储器是存储器技术最新的发展。FLASH和EEPROM技术十分类似,是EEPROM的变种。它们主要的差别是:FLASH一次只能擦除一个块,而不是一字节一字节地擦除。典型的块大小在256B~16KB范围。FLASH容量可以做得很大,且价格适中。FLASH比EEPROM要流行得多,并且还迅速地取代了很多ROM、PROM和EPROM。 NVRAM通常只是一个带有后备电池的SRAM,价格昂贵。它的使用次数没有限制,而EPROM、EEPROM和FLASH都有擦写次数的限制。 9. 问:嵌入式系统应用领域有哪些? 答:现有的嵌入式系统的数量之大、种类之多,使人不可能不卷入嵌入式系统的发展潮流。电脑微波炉是一个嵌入式应用系统;录像机是一个嵌入式应用系统;电视遥控板是一个嵌入式应用系统。如果电视带电脑,那它也是一个嵌入式应用系统。依据MOTORORA公司发布的信息:1990年的汽车平均含14个微控制器,到2000年则达到35个。 机顶盒、路由器、调制解调器,一句话,Internet的基础设施都是嵌入式应用系统,它使得嵌入式系统的应用变得越来越流行。嵌入式市场的增长主要是由于嵌入式系统的新应用和新发展。处理器的速度、总线宽度的增加,以及制造商能集成到一个芯片上的外设数量的加大都增加了嵌入式系统可用芯片的种类,以及其对应用的适应能力。RISC(精简指令集计算机)芯片在高端嵌入式应用中现已是常见的了,甚至在不算很高挡的应用中也是如此。例如,Sega公司的一种游戏机就有3个32位Hitachi SH RISC 处理器。小型、可嵌入、完全基于PC的板卡是中等规模系统中常见的;而超小型的微控制器则统治低端系统,如PHILIPS的8051系列和MICROCHIP公司的PIC系列。嵌入式系统无处不在,它渗透于我们生活的各个角落——电器、玩具、汽车、医疗仪器、飞机等。
PIC单片机输出PWM波的C语言源程序
#ifndef __PWM__H__
#define __PWM__H__
void pwm_ccp1(unsigned char a,unsigned char b);
void pwm_ccp2(unsigned char a,unsigned char b);
#endif
void pwm_ccp1(unsigned char a,unsigned char b) //左边PWM
//CCP1 模块的 PWM 工作方式,周期为(b+1)*4*Tosc*(TMR2前分频值)=b+1 us //pwm高电平=a:CCP1CON(第四五位)Tosc*(TMR2前分频值)
//pwm高电平=a:CCP1CON(第四五位)Tosc*(TMR2前分频值)
{ //a》b时有最高转速
CCPR1L=a; //* 设置工作循环的高 8bit 为 a
CCP1CON=0X0C; //0000 1100 设置 CCP1 为 PWM 工作方式,且工作循环的低 bit2 为 11*/
CCP1IE=0;; //* 禁止总中断和外围中断 */
PR2=b; //* 设置 PWM 周期 */
TRISC2=0; //* 设置 RC2/CCP1 为输出 */
T2CON=0X04; //* 0000 1000前分频比为 1:1 ,后分频器1:2,打开 TMR2 ,同时输出 PWM 信号 */
}
void pwm_ccp2(unsigned char a,unsigned char b) //右边PWM
//CCP2 模块的 PWM 工作方式,周期为(b+1)*4*Tosc*(TMR2前分频值),
//pwm高电平=a:CCP2CON(第四五位)Tosc*(TMR2前分频值)
{
CCPR2L=a; //* 设置工作循环的高 8bit 为 a
CCP2CON=0X0C; //* 设置 CCP2 为 PWM 工作方式,且工作循环的低 bit2 为 11*/
CCP2IE=0; //* 中断屏蔽
PR2=b; //* 设置 PWM 周期 */
TRISC1=0; //* 设置 RC1/CCP2 为输出 */
T2CON=0X04; //* 前分频比为 1 ,打开 TMR2 ,同时输出 PWM 信号 */
}
关于PIC单片机C语言编程
1:第一个问号:是; 第二个问号:不一定;
2:一些C30有多种类型版本,你说的30C和36可能不是指同一种类型。
3:没破解的编译器过期就不能编译程序了。想用就需要重装(貌似它会在系统内记录的,所以应该是重装操作系统才行)。
4:肯定不可靠。我有过编译经历,破解的编译出来的在逻辑上就会有问题。但这不影响普通学生入门者做设计。如果你是做工业、航天领域设计的,你的领导也不会让你用破解版或者未注册版。所以现在很多单位宁愿用汇编来编译程序。
PICC有支持 PIC10/12/16/18/24/32系列单片机 的C编译器。同时也支持dsPIC30/33 系列DSC芯片的C编译器
在pic中如何用C语言编写程序
//09/10/24
//lcd1602显示时间 日期 星期 温度
//通过按键校时:K10--小时,K11--分钟,K12--秒(归零),K13-星期,BR1--年,RB2--月,RB3--日。
//芯片要求:PIC16F877A
#include《pic.h》 //包含单片机内部资源预定义
__CONFIG(0x1832);
//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡
#define i_o RB4 //定义DS1302的数据口
#define sclk RB0 //定义DS1302的时钟口
#define rst RB5 //定义DS1302的复位口
#define rs RA1 //1602
#define rw RA2
#define e RA3
# define DQ RA0 //定义18B20数据端口
unsigned char TLV=0 ; //采集到的温度高8位
unsigned char THV=0; //采集到的温度低8位
unsigned char bai;
unsigned char shi; //整数十位
unsigned char ge; //整数个位
unsigned char shifen; //十分位
float temp;
void display();
//定义读取时间和日期存放表格
char table1;
//定义0-9的显示代码
const char table2={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char rx_data,read_data,count,sec,min,hour,day,mon,week,year,time;
//----------------------------------------------
//ds18b20部分
//------------------------------------------------
//延时函数
void delay1(unsigned int x)
{
unsigned int i;
for(i=x;i》0;i--);
}
//------------------------------------------------
//延时函数
void delay2(char x,char y)
{
char z;
do{
z=y;
do{;}while(--z);
}while(--x);
}
//其指令时间为:7+(3*(Y-1)+7)*(X-1)如果再加上函数调用的call 指令、页面设定、传递参数花掉的7 个指令。
//则是:14+(3*(Y-1)+7)*(X-1)。
//***************************************
//初始化ds18b20
void ds18b20_init()
{
char presence=1;
while(presence)
{
TRISA0=0; //主机拉至低电平
DQ=0;
delay2(2,99); //延时503us
TRISA0=1; //释放总线等电阻拉高总线,并保持15~60us
delay2(2,8); //延时70us
if(DQ==1) presence=1; //没有接收到应答信号,继续复位
else presence=0; //接收到应答信号
delay2(2,60); //延时430us
}
}
//*****************************************************
//写ds18b20
void ds18b20_write_byte(unsigned char code)
{
unsigned char i,k;
for(i=8;i》0;i--)
{
k=code&0x01;
TRISA0=0;
DQ=0; //数据线拉低产生时间片
asm("nop");
asm("nop");
if(k) DQ=1; //写1则拉高数据电平
delay1(3); //延时42us,ds18b20对数据线采样
asm("nop");
TRISA0=1; //采样结束,释放总线,拉高电平
code=code》》1;
delay1(7); //延时82us
}
}
//****************************************************
//读ds18b20
unsigned char ds18b20_read_byte()
{
unsigned char i,k;
for(i=8;i》0;i--)
{
k=k》》1;
TRISA0=0;
DQ=0; //数据线拉低再拉高产生读时间片
asm("nop");
asm("nop");
TRISA0=1;
asm("nop");
asm("nop");
if(DQ) k=k|0x80; //15us内要完成读位
delay1(6); //延时72us后释放总线
}
return (k);
}
//********************************************
//启动温度转换函数
void get_temp()
{
int i;
signed int t;
TRISA0=1;
ds18b20_init(); //复位等待从机应答
ds18b20_write_byte(0XCC); //忽略ROM匹配
ds18b20_write_byte(0X44); //发送温度转化命令
for(i=2;i》0;i--)
{
display(); //调用多次显示函数,确保温度转换完成所需要的时间
}
ds18b20_init(); //再次复位,等待从机应答
ds18b20_write_byte(0XCC); //忽略ROM匹配
ds18b20_write_byte(0XBE); //发送读温度命令
TLV=ds18b20_read_byte(); //读出温度低8
THV=ds18b20_read_byte(); //读出温度高8位
TRISA0=1; //释放总线
t=THV《《8;
t=t|TLV;
if(t《0) //负温度
{
temp=(~t+1)*0.0625*10+0.5; //负温度时,取反加1再乘以0.0625得实际温度,乘10+0.5显示小数点一位,且四舍五入
}
else
temp=t*0.0625*10+0.5; //正温度
if(t《0)
bai=’-’; //负温度时百位显示负号
else
bai=(const) temp/1000+0x30; //百位
shi=((const) temp%1000)/100; //十位
ge=((const) temp%1000)%100/10; //个位
shifen=((const) temp%1000)%100%10; //十分位
NOP();
}
//---------------------------------------------
//------------DS1303部分-----------------------
//---------------------------------------------
//延时程序
void delay() //延时程序
{
int i; //定义整形变量
for(i=0x64;i--;); //延时
}
//写一个字节数据函数
void write_byte(unsigned char data)
{
int j; //设置循环变量
for(j=0;j《8;j++) //连续写8bit
{
i_o=0; //先设置数据为0
sclk=0; //时钟信号拉低
if(data&0x01) //判断待发送的数据位是0或1
{
i_o=1; //待发送数据位是1
}
data=data》》1; //待发送的数据右移1位
sclk=1; //拉高时钟信号
}
sclk=0; //写完一个字节,拉低时钟信号
}
//---------------------------------------------
//读一个字节函数
unsigned char read_byte()
{
int j; //设置循环变量
TRISB4=1; //设置数据口方向为输入
for(j=8;j--;) //连续读取8bit
{
sclk=0; //拉低时钟信号
rx_data=rx_data》》1; //接收寄存器右移1位
if(i_o==1) rx_data=rx_data|0x80;
sclk=1; //拉高时钟信号
}
TRISB4=0; //恢复数据口方向为输出
sclk=0; //拉低时钟信号
return(rx_data); //返回读取到的数据
}
//----------------------------------------------
//写DS1302
void write_ds1302(unsigned char addr,unsigned char code)
{
rst=0;
sclk=0;
rst=1;
write_byte(addr);
write_byte(code);
sclk=0;
rst=1;
}
//-------------------------------------------
//读DS1302
void read_ds1302(unsigned char addr)
{
rst=0;
sclk=0;
rst=1;
write_byte(addr);
read_data=read_byte();
//return read_data;
}
//---------------------------------------------
//读取时间函数
void get_time()
{
int i; //设置循环变量
rst=1; //使能DS1302
write_byte(0xbf); //发送多字节读取命令
for(i=0;i《7;i++) //连续读取7个字节数据
{
table1=read_byte(); //调用读取1个字节数据的函数
}
rst=0; //复位DS1302
}
//DS1302初始化函数
void ds1302_init()
{
sclk=0; //拉低时钟信号
rst =0; //复位DS1302
rst=1; //使能DS1302
write_ds1302(0x8e,0); //发控制命令
rst=0; //复位
}
//---------------------------------------------
//设置时间函数
void set_time()
{
//定义待设置的时间: 秒、 分、 时、 日、月、星期、年、控制字
const char table={0x00,0x00,0x12,0x23,0x10,0x05,0x09,0x00};
int i; //定义循环变量
rst=1; //使能DS1302
write_byte(0xbe); //时钟多字节写命令
for(i=0;i《8;i++) //连续写8个字节数据
{
write_byte(table); //调用写一个字节函数
}
rst=0; //复位
}
//-------------------------------------------
//8位二进制数转换为十进制数
void two_to_ten(unsigned char i)
{
time=(table1》》4)*0x0a;
}
//-------------------------------------------
//十进制数转换为BCD码
void ten_to_bcd(unsigned char i)
{
time=((i/0x0a)《《4)|(i%0x0a);
}
//------------------------------------------
//校时程序
void change_time()
{
if(RC0==0) //改变星期---k13
{
delay();
if(RC0==0)
{
if(count==0)
{
count=1;
two_to_ten(5);
week=time;
week++;
if(week》=8)
{
week==1;
write_ds1302(0x8A,1);
}
else
write_ds1302(0x8A,week);
}
}
}
else if(RC1==0) //秒归零--k12
{
delay();
if(RC1==0)
{
if(count==0)
{
count=1;
write_ds1302(0x80,0);
}
}
}
else if(RC2==0) //改变分位--k11
{
delay();
if(RC2==0)
{
if(count==0)
{
count=1;
two_to_ten(1);//BCD码转换成十进制数
min=time;
min++;
if(min》=60)
{
min=0;
write_ds1302(0x82,min);
}
else
{
ten_to_bcd(min);//十进制数转换为BCD码存进DS1302
write_ds1302(0x82,time);
}
}
}
}
else if(RC3==0) //改变小时位--k10
{
delay();
if(RC3==0)
{
if(count==0)
{
count=1;
two_to_ten(2);//BCD码转换成十进制数
hour=time;
hour++;
if(hour》=24)
{
hour=0;
write_ds1302(0x84,hour);
}
else
{
ten_to_bcd(hour);
write_ds1302(0x84,time);
}
}
}
}
else if(RB2==0)
{
delay();
if(RB2==0)
{
if(count==0)
{
count=1;
two_to_ten(4);//BCD码转换成十进制数
mon=time;
mon++;
if(mon》=13)
{
mon=1;
write_ds1302(0x88,mon);
}
else
{
ten_to_bcd(mon);
write_ds1302(0x88,time);
}
}
}
}
else if(RB3==0)
{
delay();
if(RB3==0)
{
if(count==0)
{
count=1;
two_to_ten(3);//BCD码转换成十进制数
day=time;
day++;
if((table1==2)&&(day》=30)) //润年2月
{
day=1;
write_ds1302(0x86,day);
}
else if(((table1==2)&&(day》=29))//非润年的2月
{
day=1;
write_ds1302(0x86,day);
}
else if(((table1==0x12))&&(day》=32))
{
day=1;
write_ds1302(0x86,day);
}
else if(((table1==0x11))&&(day》=31))
{
day=1;
write_ds1302(0x86,day);
}
else
{
ten_to_bcd(day);
write_ds1302(0x86,time);
}
}
}
}
else if(RB1==0)
{
delay();
if(RB1==0)
{
if(count==0)
{
count=1;
two_to_ten(6);//BCD码转换成十进制数
year=time;
year++;
if(year》=16)
{
year=0x00;
write_ds1302(0x8c,0);
}
else
{
ten_to_bcd(year);
write_ds1302(0x8c,time);
}
}
}
}
else
count=0;
}
//****************************************
//**************lcd1602*******************
//****************************************
//延时程序
//void delay()
// {
// unsigned char i;
// for(i=100;i》0;i--);
// }
//****************************************
//LCD写一个字节数据
void write_lcd(unsigned char code)
{
PORTD=code;
rs=1;
rw=0;
e=0;
delay();
e=1;
}
//****************************************
//lcd写命令函数
void lcd_enable(unsigned char code)
{
PORTD=code;
rs=0;
rw=0;
e=0;
delay();
e=1;
}
//*****************************************
//lcd显示设置
void lcd_init()
{
lcd_enable(0x01); //清除显示
lcd_enable(0x38); //设置16X2显示,5X7点阵
lcd_enable(0x0c); //开显示,不显示光标
lcd_enable(0x06); //光标左移
}
//-------------------------------------------
//显示函数
void display()
{
// PORTD=0X80; //小时
lcd_enable(0X80);
write_lcd((table1》》4)+0x30);
// PORTD=0x81;
lcd_enable(0x81);
write_lcd((table1&0x0f)+0x30);
// PORTD=0X82;
lcd_enable(0X82);
write_lcd(’:’);
// PORTD=0X83; //分
lcd_enable(0X83);
write_lcd((table1》》4)+0x30);
// PORTD=0x84;
lcd_enable(0x84);
write_lcd((table1&0x0f)+0x30);
// PORTD=0X85;
lcd_enable(0X85);
write_lcd(’:’);
// PORTD=0X86; //秒
lcd_enable(0X86);
write_lcd((table1》》4)+0x30);
// PORTD=0x87;
lcd_enable(0x87);
write_lcd((table1&0x0f)+0x30);
// PORTD=0X89; //温度的百位
lcd_enable(0X89);
write_lcd(bai);
// PORTD=0X8a; //温度的十位
lcd_enable(0X8a);
write_lcd(shi+0x30);
// PORTD=0X8b; //温度的个位
lcd_enable(0X8b);
write_lcd(ge+0x30);
// PORTD=0X8c;
lcd_enable(0X8c);
write_lcd(’.’);
// PORTD=0X8d; //温度的十分位
lcd_enable(0X8d);
write_lcd(shifen+0x30);
// PORTD=0X8e; //显示’C’
lcd_enable(0X8e);
write_lcd(’C’);
//
// PORTD=0XC0; //年
lcd_enable(0XC0);
write_lcd((table1》》4)+0x30);
//PORTD=0XC1;
lcd_enable(0XC1);
write_lcd((table1&0x0f)+0x30);
// PORTD=0XC2;
lcd_enable(0XC2);
write_lcd(’-’);
// PORTD=0XC3; //月
lcd_enable(0XC3);
write_lcd((table1》》4)+0x30);
// PORTD=0xC4;
lcd_enable(0xC4);
write_lcd((table1&0x0f)+0x30);
// PORTD=0XC5;
lcd_enable(0XC5);
write_lcd(’-’);
// PORTD=0XC6; //日
lcd_enable(0XC6);
write_lcd((table1》》4)+0x30);
// PORTD=0xC7;
lcd_enable(0xC7);
write_lcd((table1&0x0f)+0x30);
// PORTD=0XCD; //星期
lcd_enable(0XCD);
write_lcd((table1&0x0f)+0x30);
}
//--------------------------------------------
//引脚定义函数
void port_init()
{
TRISA=0x00; //设置A口全输出
TRISD=0X00; //设置D口全输出
ADCON1=0X06; //设置A口为普通I/O口
TRISB=0X0E; //
OPTION=0X00; //开启B口弱上拉
PORTA=0XFF;
PORTD=0XFF; //先熄灭所有显示
lcd_init();
TRISC=0XEF; //RC3输出,其他为输入
PORTC=0XEF;
count=0;
}
//----------------------------------------------
//主函数
void main()
{
port_init(); //调用引脚初始化函数
read_ds1302(0x81); //查看DS1302是否起振
if(read_data&0x80) //否,则初始化DS1302
{
ds1302_init(); //调用DS1302初始化函数
set_time(); //调用设置时间函数
}
while(1)
{
get_time(); //调用取时间函数
change_time();
get_temp(); //调用温度转换函数
display(); //调用显示函数
}
}
有几行PIC单片机的c语言程序代码看不懂,请教一下
1 static volatile unsigned TMR1@ 0x0E;
0x0E 是寄存器地址。 表示这个TMR1是寄存器0x0E的值。 具体这个寄存器是做什么用的,需要看你芯片的datasheet,比如 16F874A 16F877A 这个都是计数寄存器的地址。
2 PopQueue应该是一个弹出队列的函数。
将队列首弹出到msg中,返回值为PopSuccess表示取数据成功,取到的数据会存在msg中。
一般用于中断传数据给主线程。这个在主线程中接收。
3 __CONFIG(x) 一般是配置寄存器的。

更多文章:
form表单制作(为什么制作的form表单会在网页显示中多出一行)
2026年10月11日 09:10
teammate(teammate,company,partner)
2026年10月11日 06:10
javascript arraybuffer(javascript可以把base64编码转换成二进制代码吗求示例代码!)
2026年10月11日 04:00
text函数公式(excel中round和text函数的区别是什么)
2026年10月11日 03:50
google chrome打不开(chrome浏览器打不开怎么回事 浏览器打不开的处理方法)
2026年10月11日 02:00
websocket整合springboot(Springboot整合Websocket遇到的坑)
2026年10月11日 01:40
drawerlayout(android 怎样让drawerlayout设置的侧滑菜单的内容充满屏幕)
2026年10月10日 19:20
xor四位数怎么运算(单片机怎样用C语言实现4个数字间的异或)
2026年10月10日 17:50



